Commit d4e31183 authored by luis_pereira87's avatar luis_pereira87

Merge remote-tracking branch 'origin/develop' into Fix_Msg4_segfault

parents 27c68b2b 142451e7
...@@ -117,6 +117,15 @@ pipeline { ...@@ -117,6 +117,15 @@ pipeline {
if (params.eNB2_Credentials == null) { if (params.eNB2_Credentials == null) {
allParametersPresent = false allParametersPresent = false
} }
if (params.UE_IPAddress == null) {
allParametersPresent = false
}
if (params.UE_SourceCodePath == null) {
allParametersPresent = false
}
if (params.UE_Credentials == null) {
allParametersPresent = false
}
// the following 4 parameters should be pushed by the master trigger // the following 4 parameters should be pushed by the master trigger
// if not present, take the job GIT variables (used for developing) // if not present, take the job GIT variables (used for developing)
if (params.eNB_Repository == null) { if (params.eNB_Repository == null) {
...@@ -213,21 +222,22 @@ pipeline { ...@@ -213,21 +222,22 @@ pipeline {
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'], [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'], [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'],
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'], [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'] [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'],
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
]) { ]) {
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}" sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n") String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
for (xmlFile in myXmlTestSuite) { for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) { if (fileExists(xmlFile)) {
try { try {
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}" sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_SourceCodePath} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}"
} catch (Exception e) { } catch (Exception e) {
currentBuild.result = 'FAILURE' currentBuild.result = 'FAILURE'
buildStageStatus = false buildStageStatus = false
} }
} }
} }
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}" sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password}"
} }
} }
} }
...@@ -253,6 +263,24 @@ pipeline { ...@@ -253,6 +263,24 @@ pipeline {
} }
} }
} }
stage('Log Collection (OAI UE - Build)') {
steps {
echo '\u2705 \u001B[32mLog Collection (OAI UE - Build)\u001B[0m'
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
]) {
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath}"
echo '\u2705 \u001B[32mLog Transfer (UE - Build)\u001B[0m'
sh "sshpass -p \'${UE_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${UE_Username}@${params.UE_IPAddress}:${UE_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
}
script {
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
}
}
}
}
stage('Log Collection (eNB - Run)') { stage('Log Collection (eNB - Run)') {
steps { steps {
withCredentials([ withCredentials([
...@@ -271,6 +299,24 @@ pipeline { ...@@ -271,6 +299,24 @@ pipeline {
} }
} }
} }
stage('Log Collection (OAI UE - Run)') {
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
]) {
echo '\u2705 \u001B[32mLog Collection (OAI UE - Run)\u001B[0m'
sh "python3 ci-scripts/main.py --mode=LogCollectOAIUE --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath}"
echo '\u2705 \u001B[32mLog Transfer (OAI UE - Run)\u001B[0m'
sh "sshpass -p \'${UE_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${UE_Username}@${params.UE_IPAddress}:${UE_SourceCodePath}/cmake_targets/ue.log.zip ./ue.log.${env.BUILD_ID}.zip || true"
}
script {
if(fileExists("ue.log.${env.BUILD_ID}.zip")) {
archiveArtifacts "ue.log.${env.BUILD_ID}.zip"
}
}
}
}
stage('Log Collection (CN)') { stage('Log Collection (CN)') {
// Bypassing this stage if EPC server is not defined // Bypassing this stage if EPC server is not defined
when { when {
......
...@@ -79,6 +79,23 @@ pipeline { ...@@ -79,6 +79,23 @@ pipeline {
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)), string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE)) booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
] ]
//calling OAIUE B200
build job: "RAN-SA-OAIUE-B200-CN5G", wait : true, propagate : false, parameters: [
string(name: 'eNB_MR', value: String.valueOf(MR)),
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
]
//calling OAIUE N310
build job: "RAN-SA-OAIUE-N310-CN5G", wait : true, propagate : false, parameters: [
string(name: 'eNB_MR', value: String.valueOf(MR)),
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
]
} }
} }
......
...@@ -1552,7 +1552,7 @@ class OaiCiTest(): ...@@ -1552,7 +1552,7 @@ class OaiCiTest():
SSH.command('cd scripts', '\$', 5) SSH.command('cd scripts', '\$', 5)
# In case of a docker-based deployment, we need to ping from the trf-gen container # In case of a docker-based deployment, we need to ping from the trf-gen container
launchFromTrfContainer = False launchFromTrfContainer = False
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE): if (re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE)) or (re.match('OAICN5G', EPC.Type, re.IGNORECASE)):
launchFromTrfContainer = True launchFromTrfContainer = True
if launchFromTrfContainer: if launchFromTrfContainer:
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5) ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
...@@ -3348,7 +3348,7 @@ class OaiCiTest(): ...@@ -3348,7 +3348,7 @@ class OaiCiTest():
self.desc = 'Automatic Termination of OAI-UE' self.desc = 'Automatic Termination of OAI-UE'
HTML.desc = self.desc HTML.desc = self.desc
self.ShowTestID() self.ShowTestID()
self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE) self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
if (RAN.Initialize_eNB_args != ''): if (RAN.Initialize_eNB_args != ''):
self.testCase_id = 'AUTO-KILL-RAN' self.testCase_id = 'AUTO-KILL-RAN'
HTML.testCase_id = self.testCase_id HTML.testCase_id = self.testCase_id
......
...@@ -24,6 +24,7 @@ gNBs = ...@@ -24,6 +24,7 @@ gNBs =
ssb_SubcarrierOffset = 0; ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1; pdsch_AntennaPorts = 1;
pusch_AntennaPorts = 1; pusch_AntennaPorts = 1;
min_rxtxtime_pdsch = 6;
servingCellConfigCommon = ( servingCellConfigCommon = (
{ {
......
Active_gNBs = ( "gNB-OAI"); Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying # Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none"; Asn1_verbosity = "none";
gNBs = gNBs =
( (
{ {
////////// Identification parameters: ////////// Identification parameters:
gNB_ID = 0xe00; gNB_CU_ID = 0xe00;
gNB_name = "gNB-OAI";
# cell_type = "CELL_MACRO_GNB";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1; gNB_name = "gNB-OAI";
plmn_list = ({ min_rxtxtime_pdsch = 6;
mcc = 208;
mnc = 99; // Tracking area code, 0x0000 and 0xfffe are reserved values
mnc_length = 2; tracking_area_code = 1;
snssaiList = (
{ plmn_list = ({
sst = 1; mcc = 208;
sd = 0x1; // 0 false, else true mnc = 97;
}, mnc_length = 2;
{ snssaiList = (
sst = 1; {
sd = 0x112233; // 0 false, else true sst = 1;
} sd = 0x010203; // 0 false, else true
); },
{
}); sst = 1;
sd = 0x112233; // 0 false, else true
nr_cellid = 12345678L; }
);
////////// Physical parameters: });
ssb_SubcarrierOffset = 0; nr_cellid = 12345678L
pdsch_AntennaPorts = 1;
pusch_AntennaPorts = 1; # tr_s_preference = "local_mac"
ul_prbblacklist = "51,52,53,54"
////////// Physical parameters:
pdcch_ConfigSIB1 = (
{ ssb_SubcarrierOffset = 0;
controlResourceSetZero = 12; pdsch_AntennaPorts = 1;
searchSpaceZero = 0; pusch_AntennaPorts = 1;
} #pusch_TargetSNRx10 = 200;
); #pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
servingCellConfigCommon = (
{ pdcch_ConfigSIB1 = (
#spCellConfigCommon {
controlResourceSetZero = 11;
physCellId = 0; searchSpaceZero = 0;
}
# downlinkConfigCommon );
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) servingCellConfigCommon = (
absoluteFrequencySSB = 641280; {
dl_frequencyBand = 78; #spCellConfigCommon
# this is 3600 MHz
dl_absoluteFrequencyPointA = 640008; physCellId = 0;
#scs-SpecificCarrierList
dl_offstToCarrier = 0; # downlinkConfigCommon
# subcarrierSpacing #frequencyInfoDL
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
dl_subcarrierSpacing = 1; #absoluteFrequencySSB = 620640;
dl_carrierBandwidth = 106; # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
#initialDownlinkBWP absoluteFrequencySSB = 621312;
#genericParameters # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
# this is RBstart=27,L=48 (275*(L-1))+RBstart #absoluteFrequencySSB = 634080;
initialDLBWPlocationAndBandwidth = 12952; # 6366 12925 12956 28875 12952 # this is 3600.48 MHz
# subcarrierSpacing #absoluteFrequencySSB = 640032;
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 #dl_frequencyBand = 78;
initialDLBWPsubcarrierSpacing = 1; # this is 3301.68 MHz
#pdcch-ConfigCommon #dl_absoluteFrequencyPointA = 620112;
initialDLBWPcontrolResourceSetZero = 12; # this is 3300.60 MHz
initialDLBWPsearchSpaceZero = 0; dl_absoluteFrequencyPointA = 620040;
#pdsch-ConfigCommon # this is 3502.56 MHz
#pdschTimeDomainAllocationList (up to 16 entries) #dl_absoluteFrequencyPointA = 633552;
initialDLBWPk0_0 = 0; #for DL slot # this is 3600.48 MHz
initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB #dl_absoluteFrequencyPointA = 640032;
initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 #scs-SpecificCarrierList
dl_offstToCarrier = 0;
initialDLBWPk0_1 = 0; #for mixed slot # subcarrierSpacing
initialDLBWPmappingType_1 = 0; # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106;
#uplinkConfigCommon #initialDownlinkBWP
#frequencyInfoUL #genericParameters
ul_frequencyBand = 78; # this is RBstart=0,L=106 (275*(L-1))+RBstart
#scs-SpecificCarrierList initialDLBWPlocationAndBandwidth = 28875;
ul_offstToCarrier = 0; # subcarrierSpacing
# subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1;
ul_subcarrierSpacing = 1; #pdcch-ConfigCommon
ul_carrierBandwidth = 106; initialDLBWPcontrolResourceSetZero = 11;
pMax = 20; initialDLBWPsearchSpaceZero = 0;
#initialUplinkBWP #pdsch-ConfigCommon
#genericParameters #pdschTimeDomainAllocationList (up to 16 entries)
initialULBWPlocationAndBandwidth = 12952; initialDLBWPk0_0 = 0;
# subcarrierSpacing #initialULBWPmappingType
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 #0=typeA,1=typeB
initialULBWPsubcarrierSpacing = 1; initialDLBWPmappingType_0 = 0;
#rach-ConfigCommon #this is SS=1,L=13
#rach-ConfigGeneric initialDLBWPstartSymbolAndLength_0 = 40;
prach_ConfigurationIndex = 98;
#prach_msg1_FDM initialDLBWPk0_1 = 0;
#0 = one, 1=two, 2=four, 3=eight initialDLBWPmappingType_1 = 0;
prach_msg1_FDM = 0; #this is SS=1,L=5
prach_msg1_FrequencyStart = 0; initialDLBWPstartSymbolAndLength_1 = 57;
zeroCorrelationZoneConfig = 13;
preambleReceivedTargetPower = -96; #uplinkConfigCommon
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) #frequencyInfoUL
preambleTransMax = 6; ul_frequencyBand = 78;
#powerRampingStep #scs-SpecificCarrierList
# 0=dB0,1=dB2,2=dB4,3=dB6 ul_offstToCarrier = 0;
powerRampingStep = 1; # subcarrierSpacing
#ra_ReponseWindow # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
#1,2,4,8,10,20,40,80 ul_subcarrierSpacing = 1;
ra_ResponseWindow = 4; ul_carrierBandwidth = 106;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR pMax = 20;
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen #initialUplinkBWP
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; #genericParameters
#oneHalf (0..15) 4,8,12,16,...60,64 initialULBWPlocationAndBandwidth = 28875;
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; # subcarrierSpacing
#ra_ContentionResolutionTimer # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
#(0..7) 8,16,24,32,40,48,56,64 initialULBWPsubcarrierSpacing = 1;
ra_ContentionResolutionTimer = 7; #rach-ConfigCommon
rsrp_ThresholdSSB = 19; #rach-ConfigGeneric
#prach-RootSequenceIndex_PR prach_ConfigurationIndex = 98;
#1 = 839, 2 = 139 #prach_msg1_FDM
prach_RootSequenceIndex_PR = 2; #0 = one, 1=two, 2=four, 3=eight
prach_RootSequenceIndex = 1; prach_msg1_FDM = 0;
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex prach_msg1_FrequencyStart = 0;
# zeroCorrelationZoneConfig = 12;
msg1_SubcarrierSpacing = 1, preambleReceivedTargetPower = -104;
# restrictedSetConfig #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
# 0=unrestricted, 1=restricted type A, 2=restricted type B preambleTransMax = 6;
restrictedSetConfig = 0, #powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
# pusch-ConfigCommon (up to 16 elements) powerRampingStep = 1;
initialULBWPk2_0 = 6; # used for UL slot #ra_ReponseWindow
initialULBWPmappingType_0 = 1 #1,2,4,8,10,20,40,80
initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 ra_ResponseWindow = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
initialULBWPk2_1 = 6; # used for mixed slot #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
initialULBWPmappingType_1 = 1; ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 #oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
initialULBWPk2_2 = 7; # used for Msg.3 during RA #ra_ContentionResolutionTimer
initialULBWPmappingType_2 = 1; #(0..7) 8,16,24,32,40,48,56,64
initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 ra_ContentionResolutionTimer = 7;
rsrp_ThresholdSSB = 19;
msg3_DeltaPreamble = 1; #prach-RootSequenceIndex_PR
p0_NominalWithGrant =-90; #1 = 839, 2 = 139
prach_RootSequenceIndex_PR = 2;
# pucch-ConfigCommon setup : prach_RootSequenceIndex = 1;
# pucchGroupHopping # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
# 0 = neither, 1= group hopping, 2=sequence hopping #
pucchGroupHopping = 0; msg1_SubcarrierSpacing = 1,
hoppingId = 40; # restrictedSetConfig
p0_nominal = -90; # 0=unrestricted, 1=restricted type A, 2=restricted type B
# ssb_PositionsInBurs_BitmapPR restrictedSetConfig = 0,
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2; # pusch-ConfigCommon (up to 16 elements)
ssb_PositionsInBurst_Bitmap = 1; initialULBWPk2_0 = 6;
initialULBWPmappingType_0 = 1
# ssb_periodicityServingCell # this is SS=2 L=13
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 initialULBWPstartSymbolAndLength_0 = 41;
ssb_periodicityServingCell = 2;
initialULBWPk2_1 = 6;
# dmrs_TypeA_position initialULBWPmappingType_1 = 1;
# 0 = pos2, 1 = pos3 # this is SS=0 L=4
dmrs_TypeA_Position = 0; initialULBWPstartSymbolAndLength_1 = 52;
# subcarrierSpacing initialULBWPk2_2 = 7;
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPmappingType_2 = 1;
subcarrierSpacing = 1; # this is SS=10 L=4
initialULBWPstartSymbolAndLength_2 = 52;
#tdd-UL-DL-ConfigurationCommon msg3_DeltaPreamble = 1;
# subcarrierSpacing p0_NominalWithGrant =-90;
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing = 1; # pucch-ConfigCommon setup :
# pattern1 # pucchGroupHopping
# dl_UL_TransmissionPeriodicity # 0 = neither, 1= group hopping, 2=sequence hopping
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 pucchGroupHopping = 0;
dl_UL_TransmissionPeriodicity = 6; hoppingId = 40;
nrofDownlinkSlots = 7; p0_nominal = -90;
nrofDownlinkSymbols = 6; # ssb_PositionsInBurs_BitmapPR
nrofUplinkSlots = 2; # 1=short, 2=medium, 3=long
nrofUplinkSymbols = 4; ssb_PositionsInBurst_PR = 2;
ssb_PositionsInBurst_Bitmap = 1;
ssPBCH_BlockPower = -25;
} # ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
); ssb_periodicityServingCell = 2;
# dmrs_TypeA_position
# ------- SCTP definitions # 0 = pos2, 1 = pos3
SCTP : dmrs_TypeA_Position = 0;
{
# Number of streams to use in input/output # subcarrierSpacing
SCTP_INSTREAMS = 2; # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
SCTP_OUTSTREAMS = 2; subcarrierSpacing = 1;
};
#tdd-UL-DL-ConfigurationCommon
////////// AMF parameters: # subcarrierSpacing
amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR"; # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ipv6 = "192:168:30::17"; referenceSubcarrierSpacing = 1;
active = "yes"; # pattern1
preference = "ipv4"; # dl_UL_TransmissionPeriodicity
} # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
); dl_UL_TransmissionPeriodicity = 6;
nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6;
NETWORK_INTERFACES : nrofUplinkSlots = 2;
{ nrofUplinkSymbols = 4;
GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR"; ssPBCH_BlockPower = -25;
GNB_INTERFACE_NAME_FOR_NGU = "eth0"; }
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
GNB_PORT_FOR_NGU = 2152; # Spec 2152 );
};
} # ------- SCTP definitions
); SCTP :
{
MACRLCs = ( # Number of streams to use in input/output
{ SCTP_INSTREAMS = 2;
num_cc = 1; SCTP_OUTSTREAMS = 2;
tr_s_preference = "local_L1"; };
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200; ////////// AMF parameters:
pucch_TargetSNRx10 = 150; amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
} ipv6 = "192:168:30::17";
); active = "yes";
preference = "ipv4";
L1s = ( }
{ );
num_cc = 1;
tr_n_preference = "local_mac"; NETWORK_INTERFACES :
pusch_proc_threads = 8; {
prach_dtx_threshold = 120;
pucch0_dtx_threshold = 150; GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
} GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
); GNB_INTERFACE_NAME_FOR_NGU = "em1";
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
RUs = ( GNB_PORT_FOR_S1U = 2152; # Spec 2152
{ };
local_rf = "yes"
nb_tx = 1 }
nb_rx = 1 );
att_tx = 0
att_rx = 0; MACRLCs = (
bands = [78]; {
max_pdschReferenceSignalPower = -27; num_cc = 1;
max_rxgain = 75; tr_s_preference = "local_L1";
eNB_instances = [0]; tr_n_preference = "local_RRC";
#beamforming 1x4 matrix: pusch_TargetSNRx10 = 200;
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; pucch_TargetSNRx10 = 200;
#clock_src = "external"; ulsch_max_frame_inactivity = 1;
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" }
} );
);
L1s = (
THREAD_STRUCT = ( {
{ num_cc = 1;
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" tr_n_preference = "local_mac";
parallel_config = "PARALLEL_SINGLE_THREAD"; pusch_proc_threads = 2;
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" prach_dtx_threshold = 120;
worker_config = "WORKER_ENABLE"; # pucch0_dtx_threshold = 150;
} }
); );
rfsimulator : RUs = (
{ {
serveraddr = "server"; local_rf = "yes"
serverport = "4043"; nb_tx = 1
options = (); #("saviq"); or/and "chanmod" nb_rx = 1
modelname = "AWGN"; att_tx = 0
IQfile = "/tmp/rfsimulator.iqs"; att_rx = 0;
}; bands = [78];
max_pdschReferenceSignalPower = -27;
security = { max_rxgain = 75;
# preferred ciphering algorithms eNB_instances = [0];
# the first one of the list that an UE supports in chosen ##beamforming 1x2 matrix: 1 layer x 2 antennas
# valid values: nea0, nea1, nea2, nea3 bf_weights = [0x00007fff, 0x0000];
ciphering_algorithms = ( "nea0" ); ##beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
# preferred integrity algorithms ## beamforming 2x2 matrix:
# the first one of the list that an UE supports in chosen # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
# valid values: nia0, nia1, nia2, nia3 ## beamforming 4x4 matrix:
integrity_algorithms = ( "nia2", "nia0" ); #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sf_extension = 0
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity' }
drb_ciphering = "yes"; );
drb_integrity = "no";
}; THREAD_STRUCT = (
{
log_config : #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
{ parallel_config = "PARALLEL_SINGLE_THREAD";
global_log_level ="info"; #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
global_log_verbosity ="medium"; worker_config = "WORKER_ENABLE";
hw_log_level ="info"; }
hw_log_verbosity ="medium"; );
phy_log_level ="info";
phy_log_verbosity ="medium"; security = {
mac_log_level ="info"; # preferred ciphering algorithms
mac_log_verbosity ="high"; # the first one of the list that an UE supports in chosen
rlc_log_level ="info"; # valid values: nea0, nea1, nea2, nea3
rlc_log_verbosity ="medium"; ciphering_algorithms = ( "nea0" );
pdcp_log_level ="info";
pdcp_log_verbosity ="medium"; # preferred integrity algorithms
rrc_log_level ="info"; # the first one of the list that an UE supports in chosen
rrc_log_verbosity ="medium"; # valid values: nia0, nia1, nia2, nia3
ngap_log_level ="debug"; integrity_algorithms = ( "nia2", "nia0" );
ngap_log_verbosity ="medium";
}; # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering = "yes";
drb_integrity = "no";
};
log_config :
{
global_log_level ="info";
global_log_verbosity ="medium";
hw_log_level ="info";
hw_log_verbosity ="medium";
phy_log_level ="info";
phy_log_verbosity ="medium";
mac_log_level ="info";
mac_log_verbosity ="high";
rlc_log_level ="info";
rlc_log_verbosity ="medium";
pdcp_log_level ="info";
pdcp_log_verbosity ="medium";
rrc_log_level ="info";
rrc_log_verbosity ="medium";
f1ap_log_level ="debug";
f1ap_log_verbosity ="medium";
};
...@@ -21,9 +21,10 @@ gNBs = ...@@ -21,9 +21,10 @@ gNBs =
////////// Physical parameters: ////////// Physical parameters:
ssb_SubcarrierOffset = 0; ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1; pdsch_AntennaPorts = 1;
pusch_AntennaPorts = 1; pusch_AntennaPorts = 1;
min_rxtxtime_pdsch = 6;
servingCellConfigCommon = ( servingCellConfigCommon = (
{ {
...@@ -124,7 +125,7 @@ gNBs = ...@@ -124,7 +125,7 @@ gNBs =
initialULBWPk2_1 = 6; # used for mixed slot initialULBWPk2_1 = 6; # used for mixed slot
initialULBWPmappingType_1 = 1; initialULBWPmappingType_1 = 1;
initialULBWPstartSymbolAndLength_1 = 69; # this is SS=10 L=2 initialULBWPstartSymbolAndLength_1 = 38; # this is SS=10 L=3
initialULBWPk2_2 = 7; # used for Msg.3 during RA initialULBWPk2_2 = 7; # used for Msg.3 during RA
initialULBWPmappingType_2 = 1; initialULBWPmappingType_2 = 1;
......
uicc0 = {
imsi = "208970100001127";
key = "fec86ba6eb707ed08905757b1bb44b8f";
opc= "c42449363bbad02b66d16bc975d77cc1";
dnn= "oai";
nssai_sst=1;
nssai_sd=66051;
}
...@@ -17,7 +17,7 @@ Ref : ...@@ -17,7 +17,7 @@ Ref :
DLSCH encoding : 230.0 DLSCH encoding : 230.0
L1 Rx processing : 175.0 L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0 PUSCH inner-receiver : 100.0
PUSCH decoding : 140.0 PUSCH decoding : 180.0
DL & UL scheduling timing stats : 37.0 DL & UL scheduling timing stats : 37.0
UL Indication : 38.0 UL Indication : 38.0
Threshold : Threshold :
......
...@@ -773,7 +773,7 @@ class EPCManagement(): ...@@ -773,7 +773,7 @@ class EPCManagement():
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue) HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
else: else:
logging.debug('Undeployment went wrong') logging.debug('Undeployment went wrong')
HTML.CreateHtmlTestRowQueu(self.Type, 'KO', 1, html_queue) HTML.CreateHtmlTestRowQueue(self.Type, 'KO', 1, html_queue)
def LogCollectHSS(self): def LogCollectHSS(self):
mySSH = SSH.SSHConnection() mySSH = SSH.SSHConnection()
......
...@@ -18,4 +18,14 @@ SA-N310 : ...@@ -18,4 +18,14 @@ SA-N310 :
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G'
bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)' bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)'
test : 'TDD, 40MHz, 60Mb DL, 3Mb UL' test : 'TDD, 40MHz, 60Mb DL, 3Mb UL'
SA-OAIUE-B200 :
job : 'RAN-SA-OAIUE-B200-CN5G'
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-OAIUE-B200-CN5G/'
bench : 'Asterix-N310-OAICN5G-OAIUE-B200'
test : 'TDD, 40MHz, Ping, (to be implemented : iperf)'
SA-OAIUE-N310 :
job : 'RAN-SA-OAIUE-N310-CN5G'
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-OAIUE-N310-CN5G/'
bench : 'Asterix-N310-OAICN5G-OAIUE-N310'
test : 'TDD, 40MHz, Ping, (to be implemented : iperf)'
...@@ -38,11 +38,4 @@ ...@@ -38,11 +38,4 @@
<forced_workspace_cleanup>True</forced_workspace_cleanup> <forced_workspace_cleanup>True</forced_workspace_cleanup>
</testCase> </testCase>
<testCase id="000002">
<class>WaitEndBuild_eNB</class>
<desc>Wait for end of Build gNB</desc>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
</testCase>
</testCaseList> </testCaseList>
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<testCase id="040000"> <testCase id="040000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>1</eNB_instance> <eNB_instance>1</eNB_instance>
<eNB_serverId>1</eNB_serverId> <eNB_serverId>1</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
<testCase id="041000"> <testCase id="041000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>1</eNB_instance> <eNB_instance>1</eNB_instance>
<eNB_serverId>1</eNB_serverId> <eNB_serverId>1</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
<htmlTabName>SA Ping DL UL with OAI NR UE</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount>
<TestCaseRequestedList>
040000
000002
010000
000002
050000
050001
000001
010002
080000
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="010000">
<class>Initialize_OAI_UE</class>
<desc>Initialize OAI UE</desc>
<air_interface>nr</air_interface>
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "serial=30C51D1" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 -E</Initialize_OAI_UE_args>
</testCase>
<testCase id="010002">
<class>Terminate_OAI_UE</class>
<desc>Terminate OAI UE</desc>
</testCase>
<testCase id="040000">
<class>Initialize_eNB</class>
<desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface>
<eNB_Trace>yes</eNB_Trace>
<eNB_Stats>yes</eNB_Stats>
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
</testCase>
<testCase id="000001">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase id="000002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
</testCase>
<testCase id="050000">
<class>Ping</class>
<desc>Ping from CN to UE: 20pings in 20sec</desc>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="050001">
<class>Ping</class>
<desc>Ping from CN to UE: 100pings in 20sec</desc>
<ping_args>-c 100 -i 0.2</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="070000">
<class>Iperf</class>
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 60M -t 60</iperf_args>
<direction>DL</direction>
<id>nrmodule2_quectel</id>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="070001">
<class>Iperf</class>
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 3M -t 60</iperf_args>
<direction>UL</direction>
<id>nrmodule2_quectel</id>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="080000">
<class>Terminate_eNB</class>
<desc>Terminate gNB</desc>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface>
</testCase>
</testCaseList>
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
<htmlTabName>SA Ping DL UL with OAI NR UE</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount>
<TestCaseRequestedList>
040000
000002
010000
000002
050000
050001
000001
010002
080000
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="010000">
<class>Initialize_OAI_UE</class>
<desc>Initialize OAI UE</desc>
<air_interface>nr</air_interface>
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 --ue-rxgain 70 --ue-fo-compensation </Initialize_OAI_UE_args>
</testCase>
<testCase id="010002">
<class>Terminate_OAI_UE</class>
<desc>Terminate OAI UE</desc>
</testCase>
<testCase id="040000">
<class>Initialize_eNB</class>
<desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface>
<eNB_Trace>yes</eNB_Trace>
<eNB_Stats>yes</eNB_Stats>
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
</testCase>
<testCase id="000001">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase id="000002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
</testCase>
<testCase id="050000">
<class>Ping</class>
<desc>Ping from CN to UE: 20pings in 20sec</desc>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="050001">
<class>Ping</class>
<desc>Ping from CN to UE: 100pings in 20sec</desc>
<ping_args>-c 100 -i 0.2</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="070000">
<class>Iperf</class>
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 60M -t 60</iperf_args>
<direction>DL</direction>
<id>nrmodule2_quectel</id>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="070001">
<class>Iperf</class>
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 3M -t 60</iperf_args>
<direction>UL</direction>
<id>nrmodule2_quectel</id>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="080000">
<class>Terminate_eNB</class>
<desc>Terminate gNB</desc>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface>
</testCase>
</testCaseList>
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
<testCase id="040000"> <testCase id="040000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
<testCase id="040000"> <testCase id="040000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -135,8 +135,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, ...@@ -135,8 +135,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
dci_pdu->AggregationLevel, dci_pdu->AggregationLevel,
0,NULL); 0,NULL);
polar_encoder_fast((uint64_t*)dci_pdu->Payload, (void*)encoder_output, n_RNTI,1,currentPtr); polar_encoder_fast((uint64_t*)dci_pdu->Payload, (void*)encoder_output, n_RNTI,1,currentPtr);
#if DEBUG_CHANNEL_CODING #ifdef DEBUG_CHANNEL_CODING
printf("polar rnti %x,length %d, L %d\n",n_RNTI, dci_pdu->PayloadSizeBits,dci_pdu->AggregationLevel); printf("polar rnti %x,length %d, L %d\n",n_RNTI, dci_pdu->PayloadSizeBits,pdcch_pdu_rel15->dci_pdu->AggregationLevel);
printf("DCI PDU: [0]->0x%lx \t [1]->0x%lx\n", printf("DCI PDU: [0]->0x%lx \t [1]->0x%lx\n",
((uint64_t*)dci_pdu->Payload)[0], ((uint64_t*)dci_pdu->Payload)[1]); ((uint64_t*)dci_pdu->Payload)[0], ((uint64_t*)dci_pdu->Payload)[1]);
printf("Encoded Payload (length:%d dwords):\n", encoded_length>>5); printf("Encoded Payload (length:%d dwords):\n", encoded_length>>5);
......
...@@ -105,7 +105,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ ...@@ -105,7 +105,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0->active = 1; dlsch0->active = 1;
dlsch0->rnti = dl_config->dl_config_list[i].dlsch_config_pdu.rnti; dlsch0->rnti = dl_config->dl_config_list[i].dlsch_config_pdu.rnti;
LOG_D(PHY,"current_harq_pid = %d\n", current_harq_pid); LOG_D(PHY,"slot %d current_harq_pid = %d\n",slot, current_harq_pid);
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch0->harq_processes[current_harq_pid]; NR_DL_UE_HARQ_t *dlsch0_harq = dlsch0->harq_processes[current_harq_pid];
if (dlsch0_harq){ if (dlsch0_harq){
...@@ -131,9 +131,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ ...@@ -131,9 +131,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table; dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch_config_pdu->rv, dlsch0->rnti_type); downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch_config_pdu->rv, dlsch0->rnti_type);
if (dlsch0_harq->status != ACTIVE) { if (dlsch0_harq->status != ACTIVE) {
// dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the // dlsch0_harq->status not ACTIVE due to false retransmission
// following flag to skip PDSCH procedures in that case. // Reset the following flag to skip PDSCH procedures in that case and retrasmit harq status
dlsch0->active = 0; dlsch0->active = 0;
update_harq_status(module_id,dlsch0->current_harq_pid,dlsch0_harq->ack);
} }
/* PTRS */ /* PTRS */
dlsch0_harq->PTRSFreqDensity = dlsch_config_pdu->PTRSFreqDensity; dlsch0_harq->PTRSFreqDensity = dlsch_config_pdu->PTRSFreqDensity;
......
...@@ -43,5 +43,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response); ...@@ -43,5 +43,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response);
\param scheduled_response including transmission config(dl_config, ul_config) and data transmission (tx_req)*/ \param scheduled_response including transmission config(dl_config, ul_config) and data transmission (tx_req)*/
int8_t nr_ue_phy_config_request(nr_phy_config_t *phy_config); int8_t nr_ue_phy_config_request(nr_phy_config_t *phy_config);
void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack);
#endif #endif
...@@ -331,7 +331,6 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) ...@@ -331,7 +331,6 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) { void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) {
if (rnti_type == _SI_RNTI_ || if (rnti_type == _SI_RNTI_ ||
rnti_type == _P_RNTI_ || rnti_type == _P_RNTI_ ||
rnti_type == _RA_RNTI_) { rnti_type == _RA_RNTI_) {
...@@ -351,38 +350,38 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int ...@@ -351,38 +350,38 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int
break; break;
case 1: case 1:
dl_harq->round = 2; dl_harq->round = 2;
dl_harq->status = ACTIVE;
dl_harq->first_rx = 0; dl_harq->first_rx = 0;
if (dl_harq->DCINdi != ndi) { if (dl_harq->DCINdi != ndi) {
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv); LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
dl_harq->status = ACTIVE;
dl_harq->first_rx = 1; dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi; dl_harq->DCINdi = ndi;
} }
else if (dl_harq->ack) else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE; dl_harq->status = SCH_IDLE;
break; break;
case 2: case 2:
dl_harq->round = 1; dl_harq->round = 1;
dl_harq->status = ACTIVE;
dl_harq->first_rx = 0; dl_harq->first_rx = 0;
if (dl_harq->DCINdi != ndi) { if (dl_harq->DCINdi != ndi) {
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv); LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
dl_harq->status = ACTIVE;
dl_harq->first_rx = 1; dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi; dl_harq->DCINdi = ndi;
} }
else if (dl_harq->ack) else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE; dl_harq->status = SCH_IDLE;
break; break;
case 3: case 3:
dl_harq->round = 3; dl_harq->round = 3;
dl_harq->status = ACTIVE;
dl_harq->first_rx = 0; dl_harq->first_rx = 0;
if (dl_harq->DCINdi != ndi) { if (dl_harq->DCINdi != ndi) {
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv); LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
dl_harq->status = ACTIVE;
dl_harq->first_rx = 1; dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi; dl_harq->DCINdi = ndi;
} }
else if (dl_harq->ack) else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE; dl_harq->status = SCH_IDLE;
break; break;
default: default:
......
...@@ -1861,11 +1861,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, ...@@ -1861,11 +1861,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
} }
// do procedures for C-RNTI // do procedures for C-RNTI
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) { if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d \n \n", nr_slot_rx); LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d\n", nr_slot_rx);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
start_meas(&ue->dlsch_procedures_stat[proc->thread_id]); start_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
......
...@@ -768,7 +768,7 @@ int main(int argc, char **argv) ...@@ -768,7 +768,7 @@ int main(int argc, char **argv)
prepare_scd(scd); prepare_scd(scd);
fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0); fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 6, 0, 0, 0);
/* RRC parameter validation for secondaryCellGroup */ /* RRC parameter validation for secondaryCellGroup */
fix_scd(scd); fix_scd(scd);
......
...@@ -713,7 +713,7 @@ int main(int argc, char **argv) ...@@ -713,7 +713,7 @@ int main(int argc, char **argv)
prepare_scd(scd); prepare_scd(scd);
fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0); fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0, 0);
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup); // xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
......
...@@ -1110,6 +1110,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { ...@@ -1110,6 +1110,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
printf("minTXRXTIMEpdsch %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr); printf("minTXRXTIMEpdsch %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIMEpdsch = *GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr; NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIMEpdsch = *GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr; NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr;
printf("minTXRXTIMEpdsch %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIMEpdsch = *GNBParamList.paramarray[i][GNB_MINRXTXTIMEPDSCH_IDX].iptr;
printf("Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr); printf("Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr; NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc; NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
......
...@@ -149,7 +149,7 @@ typedef enum { ...@@ -149,7 +149,7 @@ typedef enum {
{GNB_CONFIG_STRING_DOCSIRS, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_DOCSIRS, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_NRCELLID, NULL, 0, u64ptr:NULL, defint64val:1, TYPE_UINT64, 0}, \ {GNB_CONFIG_STRING_NRCELLID, NULL, 0, u64ptr:NULL, defint64val:1, TYPE_UINT64, 0}, \
{GNB_CONFIG_STRING_MINRXTXTIMEPDSCH, NULL, 0, iptr:NULL, defintval:2, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_MINRXTXTIMEPDSCH, NULL, 0, iptr:NULL, defintval:2, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_ULPRBBLACKLIST, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0} \ {GNB_CONFIG_STRING_ULPRBBLACKLIST, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0} \
} }
#define GNB_GNB_ID_IDX 0 #define GNB_GNB_ID_IDX 0
......
...@@ -299,9 +299,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, ...@@ -299,9 +299,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
frame_t frame, frame_t frame,
int slot); int slot);
void update_harq_status(nr_downlink_indication_t *dl_info,
int pdu_id);
uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
frame_t frame, frame_t frame,
int slot, int slot,
......
...@@ -1232,14 +1232,17 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr ...@@ -1232,14 +1232,17 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
uint8_t feedback_ti = uint8_t feedback_ti =
ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0]; ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
// set the harq status at MAC for feedback AssertFatal(feedback_ti>=DURATION_RX_TO_TX,"PDSCH to HARQ feedback time (%d) cannot be less than DURATION_RX_TO_TX (%d)\n",
set_harq_status(mac,dci->pucch_resource_indicator, feedback_ti,DURATION_RX_TO_TX);
dci->harq_pid,
dlsch_config_pdu_1_1->accumulated_delta_PUCCH, // set the harq status at MAC for feedback
feedback_ti, set_harq_status(mac,dci->pucch_resource_indicator,
dci->dai[0].val, dci->harq_pid,
dci_ind->n_CCE,dci_ind->N_CCE,0, dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
frame,slot); feedback_ti,
dci->dai[0].val,
dci_ind->n_CCE,dci_ind->N_CCE,
0, frame,slot);
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type); LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type);
...@@ -1331,25 +1334,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, ...@@ -1331,25 +1334,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
} }
void update_harq_status(nr_downlink_indication_t *dl_info, int pdu_id) {
NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id);
uint8_t harq_pid = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid;
NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid];
if (current_harq->active) {
current_harq->ack = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack;
current_harq->ack_received = true;
LOG_D(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack);
}
else {
//shouldn't get here
LOG_E(MAC, "Trying to process acknack for an inactive harq process (%d)\n", harq_pid);
}
}
void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
int slot, int slot,
uint16_t rnti, uint16_t rnti,
...@@ -2123,7 +2107,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, ...@@ -2123,7 +2107,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
uint32_t V_temp = 0; uint32_t V_temp = 0;
uint32_t V_temp2 = 0; uint32_t V_temp2 = 0;
int O_ACK = 0; int O_ACK = 0;
int o_ACK = 0; uint8_t o_ACK = 0;
int O_bit_number_cw0 = 0; int O_bit_number_cw0 = 0;
int O_bit_number_cw1 = 0; int O_bit_number_cw1 = 0;
...@@ -2151,6 +2135,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, ...@@ -2151,6 +2135,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
} }
o_ACK = o_ACK | (ack_data[0][m] << O_bit_number_cw0); o_ACK = o_ACK | (ack_data[0][m] << O_bit_number_cw0);
LOG_D(MAC,"m %d bit number %d o_ACK %d\n",m,O_bit_number_cw0,o_ACK);
} }
if (V_temp2 < V_temp) { if (V_temp2 < V_temp) {
...@@ -2169,8 +2154,11 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, ...@@ -2169,8 +2154,11 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
return (0); return (0);
} }
reverse_n_bits(&o_ACK,number_harq_feedback);
pucch->ack_payload = o_ACK; pucch->ack_payload = o_ACK;
LOG_D(MAC,"frame %d slot %d pucch acknack payload %d\n",frame,slot,o_ACK);
return(number_harq_feedback); return(number_harq_feedback);
} }
......
...@@ -2153,7 +2153,8 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in ...@@ -2153,7 +2153,8 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
if (N_UCI > 0) { if (N_UCI > 0) {
pucch->resource_set_id = find_pucch_resource_set(mac, N_UCI); LOG_D(NR_MAC,"%d.%d configure pucch, O_SR %d, O_ACK %d, O_CSI %d\n",frameP,slotP,O_SR,O_ACK,O_CSI);
pucch->resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI);
select_pucch_resource(mac, pucch); select_pucch_resource(mac, pucch);
fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP);
pthread_mutex_lock(&ul_config->mutex_ul_config); pthread_mutex_lock(&ul_config->mutex_ul_config);
......
...@@ -373,7 +373,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -373,7 +373,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
schedule_nr_prach(module_idP, f, s); schedule_nr_prach(module_idP, f, s);
} }
// This schedule SR // This schedule SR
nr_sr_reporting(module_idP, frame, slot); nr_sr_reporting(module_idP, frame, slot);
// Schedule CSI-RS transmission // Schedule CSI-RS transmission
......
...@@ -753,7 +753,7 @@ void pf_dl(module_id_t module_id, ...@@ -753,7 +753,7 @@ void pf_dl(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH /* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */ * allocation after CCE alloc fail would be more complex) */
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1,0); const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1, 0);
if (alloc<0) { if (alloc<0) {
LOG_D(NR_MAC, LOG_D(NR_MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n", "%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
......
...@@ -348,7 +348,7 @@ void nr_preprocessor_phytest(module_id_t module_id, ...@@ -348,7 +348,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
__func__, __func__,
UE_id); UE_id);
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1,0); const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1, 0);
if (alloc < 0) { if (alloc < 0) {
LOG_D(MAC, LOG_D(MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n", "%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
......
...@@ -2203,6 +2203,7 @@ void get_pdsch_to_harq_feedback(int Mod_idP, ...@@ -2203,6 +2203,7 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
} }
void nr_csirs_scheduling(int Mod_idP, void nr_csirs_scheduling(int Mod_idP,
frame_t frame, frame_t frame,
sub_frame_t slot, sub_frame_t slot,
......
...@@ -1099,6 +1099,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, ...@@ -1099,6 +1099,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
DevAssert(harq->is_waiting); DevAssert(harq->is_waiting);
const int8_t pid = sched_ctrl->feedback_dl_harq.head; const int8_t pid = sched_ctrl->feedback_dl_harq.head;
remove_front_nr_list(&sched_ctrl->feedback_dl_harq); remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
LOG_D(NR_MAC,"bit %d pid %d ack/nack %d\n",harq_bit,pid,harq_value);
handle_dl_harq(mod_id, UE_id, pid, harq_value == 0 && harq_confidence == 0); handle_dl_harq(mod_id, UE_id, pid, harq_value == 0 && harq_confidence == 0);
if (harq_confidence == 1) UE_info->mac_stats[UE_id].pucch0_DTX++; if (harq_confidence == 1) UE_info->mac_stats[UE_id].pucch0_DTX++;
} }
...@@ -1187,7 +1188,7 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1187,7 +1188,7 @@ int nr_acknack_scheduling(int mod_id,
const int nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0; const int nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0;
const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + nr_mix_slots; const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + nr_mix_slots;
const int first_ul_slot_tdd = tdd->nrofDownlinkSlots + nr_slots_period * (slot / nr_slots_period); const int first_ul_slot_tdd = tdd->nrofDownlinkSlots + nr_slots_period * (slot / nr_slots_period);
const int first_ul_slot_period = first_ul_slot_tdd%nr_slots_period; const int first_ul_slot_period = tdd->nrofDownlinkSlots;
const int CC_id = 0; const int CC_id = 0;
NR_sched_pucch_t *csi_pucch; NR_sched_pucch_t *csi_pucch;
...@@ -1236,11 +1237,11 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1236,11 +1237,11 @@ int nr_acknack_scheduling(int mod_id,
&& !csi_pucch->simultaneous_harqcsi) { && !csi_pucch->simultaneous_harqcsi) {
nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id); nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
memset(csi_pucch, 0, sizeof(*csi_pucch)); memset(csi_pucch, 0, sizeof(*csi_pucch));
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f; pucch->frame = pucch->ul_slot == n_slots_frame - 1 ? (pucch->frame + 1) % 1024 : pucch->frame;
if(((s + 1)%nr_slots_period) == 0) if(((pucch->ul_slot + 1)%nr_slots_period) == 0)
pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame; pucch->ul_slot = (pucch->ul_slot + 1 + first_ul_slot_period) % n_slots_frame;
else else
pucch->ul_slot = (s + 1) % n_slots_frame; pucch->ul_slot = (pucch->ul_slot + 1) % n_slots_frame;
} }
} }
...@@ -1264,7 +1265,6 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1264,7 +1265,6 @@ int nr_acknack_scheduling(int mod_id,
int max_fb_time = 0; int max_fb_time = 0;
get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, &max_fb_time, pdsch_to_harq_feedback); get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, &max_fb_time, pdsch_to_harq_feedback);
int max_absslot = frame*n_slots_frame + slot + max_fb_time;
LOG_D(NR_MAC,"pucch_acknak 1b. DL %d.%d, UL_ACK %d.%d, DAI_C %d\n",frame,slot,pucch->frame,pucch->ul_slot,pucch->dai_c); LOG_D(NR_MAC,"pucch_acknak 1b. DL %d.%d, UL_ACK %d.%d, DAI_C %d\n",frame,slot,pucch->frame,pucch->ul_slot,pucch->dai_c);
/* there is a HARQ. Check whether we can use it for this ACKNACK */ /* there is a HARQ. Check whether we can use it for this ACKNACK */
...@@ -1273,7 +1273,10 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1273,7 +1273,10 @@ int nr_acknack_scheduling(int mod_id,
// Find the right timing_indicator value. // Find the right timing_indicator value.
int i = 0; int i = 0;
while (i < 8) { while (i < 8) {
if (pdsch_to_harq_feedback[i] == pucch->ul_slot - slot) int diff = pucch->ul_slot - slot;
if (diff<0)
diff += n_slots_frame;
if (pdsch_to_harq_feedback[i] == diff)
break; break;
++i; ++i;
} }
...@@ -1303,8 +1306,10 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1303,8 +1306,10 @@ int nr_acknack_scheduling(int mod_id,
LOG_D(NR_MAC,"pucch_acknak : %d.%d DAI = 0, looking for new pucch occasion\n",frame,slot); LOG_D(NR_MAC,"pucch_acknak : %d.%d DAI = 0, looking for new pucch occasion\n",frame,slot);
/* we need to find a new PUCCH occasion */ /* we need to find a new PUCCH occasion */
/*Inizialization of timing information*/ /*(Re)Inizialization of timing information*/
if (pucch->frame == 0 && pucch->ul_slot == 0) { if ((pucch->frame == 0 && pucch->ul_slot == 0) ||
((pucch->frame*n_slots_frame + pucch->ul_slot) <
(frame*n_slots_frame + slot))) {
AssertFatal(pucch->sr_flag + pucch->dai_c == 0, AssertFatal(pucch->sr_flag + pucch->dai_c == 0,
"expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n", "expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n",
UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot); UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
...@@ -1314,13 +1319,16 @@ int nr_acknack_scheduling(int mod_id, ...@@ -1314,13 +1319,16 @@ int nr_acknack_scheduling(int mod_id,
// Find the right timing_indicator value. // Find the right timing_indicator value.
int ind_found = -1; int ind_found = -1;
// while we are within the feedback limits and it has not been // while we are within the feedback limits
while ((pucch->frame*n_slots_frame + pucch->ul_slot) <= max_absslot) { while ((n_slots_frame + pucch->ul_slot - slot) % n_slots_frame <= max_fb_time) {
int i = 0; int i = 0;
while (i < 8) { while (i < 8) {
LOG_D(NR_MAC,"pdsch_to_harq_feedback[%d] = %d (pucch->ul_slot %d - slot %d)\n", LOG_D(NR_MAC,"pdsch_to_harq_feedback[%d] = %d (pucch->ul_slot %d - slot %d)\n",
i,pdsch_to_harq_feedback[i],pucch->ul_slot,slot); i,pdsch_to_harq_feedback[i],pucch->ul_slot,slot);
if (pdsch_to_harq_feedback[i] == pucch->ul_slot - slot) { int diff = pucch->ul_slot - slot;
if (diff<0)
diff += n_slots_frame;
if (pdsch_to_harq_feedback[i] == diff) {
ind_found = i; ind_found = i;
break; break;
} }
......
...@@ -63,6 +63,8 @@ typedef struct nr_rlc_entity_t { ...@@ -63,6 +63,8 @@ typedef struct nr_rlc_entity_t {
void (*max_retx_reached)(void *max_retx_reached_data, void (*max_retx_reached)(void *max_retx_reached_data,
struct nr_rlc_entity_t *entity); struct nr_rlc_entity_t *entity);
void *max_retx_reached_data; void *max_retx_reached_data;
/* buffer status computation */
nr_rlc_entity_buffer_status_t bstatus;
} nr_rlc_entity_t; } nr_rlc_entity_t;
nr_rlc_entity_t *new_nr_rlc_entity_am( nr_rlc_entity_t *new_nr_rlc_entity_am(
......
...@@ -28,6 +28,19 @@ ...@@ -28,6 +28,19 @@
#include "LOG/log.h" #include "LOG/log.h"
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static int compute_pdu_header_size(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_t *sdu)
{
int header_size = 2;
/* one more byte if SN field length is 18 */
if (entity->sn_field_length == 18)
header_size++;
/* two more bytes for SO if SDU segment is not the first */
if (!sdu->is_first) header_size += 2;
return header_size;
}
/*************************************************************************/ /*************************************************************************/
/* PDU RX functions */ /* PDU RX functions */
/*************************************************************************/ /*************************************************************************/
...@@ -114,6 +127,10 @@ static void consider_retransmission(nr_rlc_entity_am_t *entity, ...@@ -114,6 +127,10 @@ static void consider_retransmission(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_list_append(&entity->retransmit_list, nr_rlc_sdu_segment_list_append(&entity->retransmit_list,
&entity->retransmit_end, &entity->retransmit_end,
cur); cur);
/* update buffer status */
entity->common.bstatus.retx_size += compute_pdu_header_size(entity, cur)
+ cur->size;
} }
/* checks that all the bytes of the SDU sn have been received (but SDU /* checks that all the bytes of the SDU sn have been received (but SDU
...@@ -351,6 +368,9 @@ static void process_received_ack(nr_rlc_entity_am_t *entity, int ack_sn) ...@@ -351,6 +368,9 @@ static void process_received_ack(nr_rlc_entity_am_t *entity, int ack_sn)
} }
/* remove from retransmit list */ /* remove from retransmit list */
prev->next = cur->next; prev->next = cur->next;
/* update buffer status */
entity->common.bstatus.retx_size -= compute_pdu_header_size(entity, cur)
+ cur->size;
/* put the PDU in the ack list */ /* put the PDU in the ack list */
entity->ack_list = nr_rlc_sdu_segment_list_add(sn_compare_tx, entity, entity->ack_list = nr_rlc_sdu_segment_list_add(sn_compare_tx, entity,
entity->ack_list, cur); entity->ack_list, cur);
...@@ -840,19 +860,6 @@ static int serialize_sdu(nr_rlc_entity_am_t *entity, ...@@ -840,19 +860,6 @@ static int serialize_sdu(nr_rlc_entity_am_t *entity,
return encoder.byte + sdu->size; return encoder.byte + sdu->size;
} }
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static int compute_pdu_header_size(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_t *sdu)
{
int header_size = 2;
/* one more byte if SN field length is 18 */
if (entity->sn_field_length == 18)
header_size++;
/* two more bytes for SO if SDU segment is not the first */
if (!sdu->is_first) header_size += 2;
return header_size;
}
/* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size' /* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size'
* bytes * bytes
* - modifies SDU/SDU segment to become an SDU segment * - modifies SDU/SDU segment to become an SDU segment
...@@ -1426,8 +1433,12 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer, ...@@ -1426,8 +1433,12 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer,
sdu->next = NULL; sdu->next = NULL;
/* segment if necessary */
pdu_size = pdu_header_size + sdu->size; pdu_size = pdu_header_size + sdu->size;
/* update buffer status */
entity->common.bstatus.retx_size -= pdu_size;
/* segment if necessary */
if (pdu_size > size) { if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu; nr_rlc_sdu_segment_t *next_sdu;
next_sdu = resegment(sdu, entity, size); next_sdu = resegment(sdu, entity, size);
...@@ -1436,6 +1447,9 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer, ...@@ -1436,6 +1447,9 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer,
entity->retransmit_list = next_sdu; entity->retransmit_list = next_sdu;
if (entity->retransmit_end == NULL) if (entity->retransmit_end == NULL)
entity->retransmit_end = entity->retransmit_list; entity->retransmit_end = entity->retransmit_list;
/* update buffer status */
entity->common.bstatus.retx_size += compute_pdu_header_size(entity, next_sdu)
+ next_sdu->size;
} }
/* put SDU/SDU segment in the wait list */ /* put SDU/SDU segment in the wait list */
...@@ -1479,11 +1493,15 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size) ...@@ -1479,11 +1493,15 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
sdu->next = NULL; sdu->next = NULL;
pdu_size = pdu_header_size + sdu->size;
/* update buffer status */
entity->common.bstatus.tx_size -= pdu_size;
/* assign SN to SDU */ /* assign SN to SDU */
sdu->sdu->sn = entity->tx_next; sdu->sdu->sn = entity->tx_next;
/* segment if necessary */ /* segment if necessary */
pdu_size = pdu_header_size + sdu->size;
if (pdu_size > size) { if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu; nr_rlc_sdu_segment_t *next_sdu;
next_sdu = resegment(sdu, entity, size); next_sdu = resegment(sdu, entity, size);
...@@ -1492,6 +1510,9 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size) ...@@ -1492,6 +1510,9 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
entity->tx_list = next_sdu; entity->tx_list = next_sdu;
if (entity->tx_end == NULL) if (entity->tx_end == NULL)
entity->tx_end = entity->tx_list; entity->tx_end = entity->tx_list;
/* update buffer status */
entity->common.bstatus.tx_size += compute_pdu_header_size(entity, next_sdu)
+ next_sdu->size;
} }
/* update tx_next if the SDU segment is the last */ /* update tx_next if the SDU segment is the last */
...@@ -1520,24 +1541,6 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size) ...@@ -1520,24 +1541,6 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
return serialize_sdu(entity, sdu, buffer, size, p); return serialize_sdu(entity, sdu, buffer, size, p);
} }
/* Pretend to serialize all the SDUs in a list and return the size
* of all the PDUs it would produce, limited to 'maxsize'.
* Used for buffer status reporting.
*/
static int tx_list_size(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_t *l, int maxsize)
{
int ret = 0;
while (l != NULL && ret < maxsize) {
ret += compute_pdu_header_size(entity, l) + l->size;
l = l->next;
}
if (ret > maxsize) ret = maxsize;
return ret;
}
nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status( nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status(
nr_rlc_entity_t *_entity, int maxsize) nr_rlc_entity_t *_entity, int maxsize)
{ {
...@@ -1549,8 +1552,8 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status( ...@@ -1549,8 +1552,8 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status(
else else
ret.status_size = 0; ret.status_size = 0;
ret.tx_size = tx_list_size(entity, entity->tx_list, maxsize); ret.tx_size = entity->common.bstatus.tx_size;
ret.retx_size = tx_list_size(entity, entity->retransmit_list, maxsize); ret.retx_size = entity->common.bstatus.retx_size;
return ret; return ret;
} }
...@@ -1606,6 +1609,10 @@ void nr_rlc_entity_am_recv_sdu(nr_rlc_entity_t *_entity, ...@@ -1606,6 +1609,10 @@ void nr_rlc_entity_am_recv_sdu(nr_rlc_entity_t *_entity,
LOG_D(RLC, "Created new RLC SDU and append it to the RLC list \n"); LOG_D(RLC, "Created new RLC SDU and append it to the RLC list \n");
nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu); nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu);
/* update buffer status */
entity->common.bstatus.tx_size += compute_pdu_header_size(entity, sdu)
+ sdu->size;
} }
/*************************************************************************/ /*************************************************************************/
...@@ -1793,6 +1800,10 @@ void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id) ...@@ -1793,6 +1800,10 @@ void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id)
entity->tx_end = NULL; entity->tx_end = NULL;
} }
/* update buffer status */
entity->common.bstatus.tx_size -= compute_pdu_header_size(entity, cur)
+ cur->size;
nr_rlc_free_sdu_segment(cur); nr_rlc_free_sdu_segment(cur);
} }
...@@ -1845,6 +1856,9 @@ static void clear_entity(nr_rlc_entity_am_t *entity) ...@@ -1845,6 +1856,9 @@ static void clear_entity(nr_rlc_entity_am_t *entity)
entity->retransmit_end = NULL; entity->retransmit_end = NULL;
entity->ack_list = NULL; entity->ack_list = NULL;
entity->common.bstatus.tx_size = 0;
entity->common.bstatus.retx_size = 0;
} }
void nr_rlc_entity_am_reestablishment(nr_rlc_entity_t *_entity) void nr_rlc_entity_am_reestablishment(nr_rlc_entity_t *_entity)
......
...@@ -68,22 +68,12 @@ static int generate_tx_pdu(nr_rlc_entity_tm_t *entity, char *buffer, int size) ...@@ -68,22 +68,12 @@ static int generate_tx_pdu(nr_rlc_entity_tm_t *entity, char *buffer, int size)
memcpy(buffer, sdu->sdu->data, sdu->size); memcpy(buffer, sdu->sdu->data, sdu->size);
entity->tx_size -= sdu->size; entity->tx_size -= sdu->size;
nr_rlc_free_sdu_segment(sdu);
return ret; /* update buffer status */
} entity->common.bstatus.tx_size -= sdu->size;
static int tx_list_size(nr_rlc_entity_tm_t *entity,
nr_rlc_sdu_segment_t *l, int maxsize)
{
int ret = 0;
while (l != NULL && ret < maxsize) { nr_rlc_free_sdu_segment(sdu);
ret += l->size;
l = l->next;
}
if (ret > maxsize) ret = maxsize;
return ret; return ret;
} }
...@@ -94,7 +84,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_tm_buffer_status( ...@@ -94,7 +84,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_tm_buffer_status(
nr_rlc_entity_buffer_status_t ret; nr_rlc_entity_buffer_status_t ret;
ret.status_size = 0; ret.status_size = 0;
ret.tx_size = tx_list_size(entity, entity->tx_list, maxsize); ret.tx_size = entity->common.bstatus.tx_size;
ret.retx_size = 0; ret.retx_size = 0;
return ret; return ret;
...@@ -136,6 +126,9 @@ void nr_rlc_entity_tm_recv_sdu(nr_rlc_entity_t *_entity, ...@@ -136,6 +126,9 @@ void nr_rlc_entity_tm_recv_sdu(nr_rlc_entity_t *_entity,
sdu = nr_rlc_new_sdu(buffer, size, sdu_id); sdu = nr_rlc_new_sdu(buffer, size, sdu_id);
nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu); nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu);
/* update buffer status */
entity->common.bstatus.tx_size += sdu->size;
} }
/*************************************************************************/ /*************************************************************************/
...@@ -165,6 +158,8 @@ static void clear_entity(nr_rlc_entity_tm_t *entity) ...@@ -165,6 +158,8 @@ static void clear_entity(nr_rlc_entity_tm_t *entity)
entity->tx_list = NULL; entity->tx_list = NULL;
entity->tx_end = NULL; entity->tx_end = NULL;
entity->tx_size = 0; entity->tx_size = 0;
entity->common.bstatus.tx_size = 0;
} }
void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity) void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity)
......
...@@ -28,6 +28,20 @@ ...@@ -28,6 +28,20 @@
#include "LOG/log.h" #include "LOG/log.h"
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static int compute_pdu_header_size(nr_rlc_entity_um_t *entity,
nr_rlc_sdu_segment_t *sdu)
{
int header_size = 1;
/* if SN to be included then one more byte if SN field length is 12 */
if (!(sdu->is_first && sdu->is_last) && entity->sn_field_length == 12)
header_size++;
/* two more bytes for SO if SDU segment is not the first */
if (!sdu->is_first) header_size += 2;
return header_size;
}
/*************************************************************************/ /*************************************************************************/
/* PDU RX functions */ /* PDU RX functions */
/*************************************************************************/ /*************************************************************************/
...@@ -375,20 +389,6 @@ static int serialize_sdu(nr_rlc_entity_um_t *entity, ...@@ -375,20 +389,6 @@ static int serialize_sdu(nr_rlc_entity_um_t *entity,
return encoder.byte + sdu->size; return encoder.byte + sdu->size;
} }
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static int compute_pdu_header_size(nr_rlc_entity_um_t *entity,
nr_rlc_sdu_segment_t *sdu)
{
int header_size = 1;
/* if SN to be included then one more byte if SN field length is 12 */
if (!(sdu->is_first && sdu->is_last) && entity->sn_field_length == 12)
header_size++;
/* two more bytes for SO if SDU segment is not the first */
if (!sdu->is_first) header_size += 2;
return header_size;
}
/* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size' /* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size'
* bytes * bytes
* - modifies SDU/SDU segment to become an SDU segment * - modifies SDU/SDU segment to become an SDU segment
...@@ -462,8 +462,12 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size) ...@@ -462,8 +462,12 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
/* assign SN to SDU */ /* assign SN to SDU */
sdu->sdu->sn = entity->tx_next; sdu->sdu->sn = entity->tx_next;
/* segment if necessary */
pdu_size = pdu_header_size + sdu->size; pdu_size = pdu_header_size + sdu->size;
/* update buffer status */
entity->common.bstatus.tx_size -= pdu_size;
/* segment if necessary */
if (pdu_size > size) { if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu; nr_rlc_sdu_segment_t *next_sdu;
next_sdu = resegment(sdu, entity, size); next_sdu = resegment(sdu, entity, size);
...@@ -474,6 +478,9 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size) ...@@ -474,6 +478,9 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
entity->tx_list = next_sdu; entity->tx_list = next_sdu;
if (entity->tx_end == NULL) if (entity->tx_end == NULL)
entity->tx_end = entity->tx_list; entity->tx_end = entity->tx_list;
/* update buffer status */
entity->common.bstatus.tx_size += compute_pdu_header_size(entity, next_sdu)
+ next_sdu->size;
} }
/* update tx_next if the SDU is an SDU segment and is the last */ /* update tx_next if the SDU is an SDU segment and is the last */
...@@ -488,24 +495,6 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size) ...@@ -488,24 +495,6 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
return ret; return ret;
} }
/* Pretend to serialize all the SDUs in a list and return the size
* of all the PDUs it would produce, limited to 'maxsize'.
* Used for buffer status reporting.
*/
static int tx_list_size(nr_rlc_entity_um_t *entity,
nr_rlc_sdu_segment_t *l, int maxsize)
{
int ret = 0;
while (l != NULL && ret < maxsize) {
ret += compute_pdu_header_size(entity, l) + l->size;
l = l->next;
}
if (ret > maxsize) ret = maxsize;
return ret;
}
nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status( nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status(
nr_rlc_entity_t *_entity, int maxsize) nr_rlc_entity_t *_entity, int maxsize)
{ {
...@@ -513,7 +502,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status( ...@@ -513,7 +502,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status(
nr_rlc_entity_buffer_status_t ret; nr_rlc_entity_buffer_status_t ret;
ret.status_size = 0; ret.status_size = 0;
ret.tx_size = tx_list_size(entity, entity->tx_list, maxsize); ret.tx_size = entity->common.bstatus.tx_size;
ret.retx_size = 0; ret.retx_size = 0;
return ret; return ret;
...@@ -555,6 +544,10 @@ void nr_rlc_entity_um_recv_sdu(nr_rlc_entity_t *_entity, ...@@ -555,6 +544,10 @@ void nr_rlc_entity_um_recv_sdu(nr_rlc_entity_t *_entity,
sdu = nr_rlc_new_sdu(buffer, size, sdu_id); sdu = nr_rlc_new_sdu(buffer, size, sdu_id);
nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu); nr_rlc_sdu_segment_list_append(&entity->tx_list, &entity->tx_end, sdu);
/* update buffer status */
entity->common.bstatus.tx_size += compute_pdu_header_size(entity, sdu)
+ sdu->size;
} }
/*************************************************************************/ /*************************************************************************/
...@@ -650,6 +643,10 @@ void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id) ...@@ -650,6 +643,10 @@ void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id)
entity->tx_end = NULL; entity->tx_end = NULL;
} }
/* update buffer status */
entity->common.bstatus.tx_size -= compute_pdu_header_size(entity, cur)
+ cur->size;
nr_rlc_free_sdu_segment(cur); nr_rlc_free_sdu_segment(cur);
} }
...@@ -682,6 +679,8 @@ static void clear_entity(nr_rlc_entity_um_t *entity) ...@@ -682,6 +679,8 @@ static void clear_entity(nr_rlc_entity_um_t *entity)
entity->tx_list = NULL; entity->tx_list = NULL;
entity->tx_end = NULL; entity->tx_end = NULL;
entity->tx_size = 0; entity->tx_size = 0;
entity->common.bstatus.tx_size = 0;
} }
void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity) void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity)
......
...@@ -81,13 +81,32 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t ...@@ -81,13 +81,32 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
// Note: sdu should always be processed because data and timing advance updates are transmitted by the UE // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){ int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
update_harq_status(dl_info, pdu_id); update_harq_status(dl_info->module_id,
dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid,
dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack);
if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack) if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack)
nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id); nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
return 0; return 0;
} }
void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack) {
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid];
if (current_harq->active) {
current_harq->ack = ack_nack;
current_harq->ack_received = true;
LOG_D(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack);
}
else {
//shouldn't get here
LOG_E(MAC, "Trying to process acknack for an inactive harq process (%d)\n", harq_pid);
}
}
int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
NR_UE_L2_STATE_t ret; NR_UE_L2_STATE_t ret;
......
...@@ -79,6 +79,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ...@@ -79,6 +79,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
int scg_id, int scg_id,
int servCellIndex, int servCellIndex,
int dl_antenna_ports, int dl_antenna_ports,
int minRXTXTIMEpdsch,
int do_csirs, int do_csirs,
int initial_csi_index, int initial_csi_index,
int uid); int uid);
...@@ -90,6 +91,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon ...@@ -90,6 +91,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_RRCReconfiguration_IEs_t *reconfig, NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup, NR_CellGroupConfig_t *secondaryCellGroup,
int dl_antenna_ports, int dl_antenna_ports,
int minRXTXTIMEpdsch,
int do_csirs, int do_csirs,
int initial_csi_index, int initial_csi_index,
int uid); int uid);
......
...@@ -241,6 +241,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ...@@ -241,6 +241,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
reconfig_ies, reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup, ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts, carrier->pdsch_AntennaPorts,
carrier->minRXTXTIMEpdsch,
carrier->do_CSIRS, carrier->do_CSIRS,
carrier->initial_csi_index[ue_context_p->local_uid + 1], carrier->initial_csi_index[ue_context_p->local_uid + 1],
ue_context_p->local_uid); ue_context_p->local_uid);
...@@ -250,6 +251,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ...@@ -250,6 +251,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
reconfig_ies, reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup, ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts, carrier->pdsch_AntennaPorts,
carrier->minRXTXTIMEpdsch,
carrier->do_CSIRS, carrier->do_CSIRS,
carrier->initial_csi_index[ue_context_p->local_uid + 1], carrier->initial_csi_index[ue_context_p->local_uid + 1],
ue_context_p->local_uid); ue_context_p->local_uid);
......
...@@ -55,6 +55,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ...@@ -55,6 +55,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
int scg_id, int scg_id,
int servCellIndex, int servCellIndex,
int dl_antenna_ports, int dl_antenna_ports,
int minRXTXTIMEpdsch,
int do_csirs, int do_csirs,
int initial_csi_index, int initial_csi_index,
int uid) { int uid) {
...@@ -945,7 +946,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ...@@ -945,7 +946,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
long *delay[8]; long *delay[8];
for (int i=0;i<8;i++) { for (int i=0;i<8;i++) {
delay[i] = calloc(1,sizeof(*delay[i])); delay[i] = calloc(1,sizeof(*delay[i]));
*delay[i] = (i<6) ? (i+2) : 0; *delay[i] = i+minRXTXTIMEpdsch;
ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]); ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
} }
pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList)); pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
...@@ -1348,6 +1349,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon ...@@ -1348,6 +1349,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_RRCReconfiguration_IEs_t *reconfig, NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup, NR_CellGroupConfig_t *secondaryCellGroup,
int dl_antenna_ports, int dl_antenna_ports,
int minRXTXTIMEpdsch,
int do_csirs, int do_csirs,
int initial_csi_index, int initial_csi_index,
int uid) { int uid) {
...@@ -1363,6 +1365,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon ...@@ -1363,6 +1365,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
1, 1,
1, 1,
dl_antenna_ports, dl_antenna_ports,
minRXTXTIMEpdsch,
do_csirs, do_csirs,
initial_csi_index, initial_csi_index,
uid); uid);
......
...@@ -512,8 +512,8 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance, ...@@ -512,8 +512,8 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance,
return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data); return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data);
} }
const char *X2AP_cause_str1[4]={"radioNetwork","transport","protocol","misc"}; const char *X2AP_ResetRequest_str[2]={"X2AP_ResetRequest_IEs__value_PR_Cause","X2AP_ResetRequest_IEs__value_PR_InterfaceInstanceIndication"};
const char *X2AP_case_str_radio[50]={" X2AP_CauseRadioNetwork_handover_desirable_for_radio_reasons", const char *X2AP_case_str_radio[50]={"X2AP_CauseRadioNetwork_handover_desirable_for_radio_reasons",
"X2AP_CauseRadioNetwork_time_critical_handover", "X2AP_CauseRadioNetwork_time_critical_handover",
"X2AP_CauseRadioNetwork_resource_optimisation_handover", "X2AP_CauseRadioNetwork_resource_optimisation_handover",
"X2AP_CauseRadioNetwork_reduce_load_in_serving_cell", "X2AP_CauseRadioNetwork_reduce_load_in_serving_cell",
...@@ -617,8 +617,9 @@ x2ap_eNB_handle_x2_reset_request(instance_t instance, ...@@ -617,8 +617,9 @@ x2ap_eNB_handle_x2_reset_request(instance_t instance,
X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__); X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
return -1; return -1;
} else { } else {
AssertFatal(ie->value.present <= X2AP_Cause_PR_misc && ie->value.present > 0,"Cause value %d, is impossible\n",ie->value.present); AssertFatal(ie->value.present <= X2AP_ResetRequest_IEs__value_PR_InterfaceInstanceIndication && ie->value.present > 0,
LOG_I(X2AP,"Received X2AP Reset Request with Cause Type %s\n",X2AP_cause_str1[ie->value.present-1]); "Cause value %d, is impossible\n",ie->value.present);
LOG_I(X2AP,"Received X2AP Reset Request with Cause Type %s\n",X2AP_ResetRequest_str[ie->value.present-1]);
} }
X2AP_DEBUG("Adding eNB to the list of associated eNBs\n"); X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment