diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
index dd9fbbd03c..f594511b0a 100644
--- a/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
+++ b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
@@ -117,6 +117,15 @@ pipeline {
if (params.eNB2_Credentials == null) {
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
// if not present, take the job GIT variables (used for developing)
if (params.eNB_Repository == null) {
@@ -213,21 +222,22 @@ pipeline {
[$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.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}"
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
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) {
currentBuild.result = 'FAILURE'
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 {
}
}
}
+ 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)') {
steps {
withCredentials([
@@ -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)') {
// Bypassing this stage if EPC server is not defined
when {
diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa
index 27e27c8426..de0b5c96ff 100644
--- a/ci-scripts/Jenkinsfile-trig-nsa
+++ b/ci-scripts/Jenkinsfile-trig-nsa
@@ -79,6 +79,23 @@ pipeline {
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
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))
+ ]
+
}
}
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index cc6e235ab3..3a218b17b8 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -1552,7 +1552,7 @@ class OaiCiTest():
SSH.command('cd scripts', '\$', 5)
# In case of a docker-based deployment, we need to ping from the trf-gen container
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
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)
@@ -3348,7 +3348,7 @@ class OaiCiTest():
self.desc = 'Automatic Termination of OAI-UE'
HTML.desc = self.desc
self.ShowTestID()
- self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE)
+ self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
if (RAN.Initialize_eNB_args != ''):
self.testCase_id = 'AUTO-KILL-RAN'
HTML.testCase_id = self.testCase_id
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index 1c62882406..e93177e7cc 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -24,6 +24,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
pusch_AntennaPorts = 1;
+ min_rxtxtime_pdsch = 6;
servingCellConfigCommon = (
{
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
index 0e8466e2df..e8be5a6ef0 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
@@ -263,7 +263,7 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
- pusch_proc_threads = 2;
+ pusch_proc_threads = 4;
prach_dtx_threshold = 120;
# pucch0_dtx_threshold = 150;
}
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
index a5d35d450e..f00a343089 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -1,320 +1,343 @@
-Active_gNBs = ( "gNB-OAI");
-# Asn1_verbosity, choice in: none, info, annoying
-Asn1_verbosity = "none";
-
-gNBs =
-(
- {
- ////////// Identification parameters:
- gNB_ID = 0xe00;
- gNB_name = "gNB-OAI";
-
- // Tracking area code, 0x0000 and 0xfffe are reserved values
- tracking_area_code = 1;
- plmn_list = ({
- mcc = 208;
- mnc = 99;
- mnc_length = 2;
- snssaiList = (
- {
- sst = 1;
- sd = 0x1; // 0 false, else true
- },
- {
- sst = 1;
- sd = 0x112233; // 0 false, else true
- }
- );
-
- });
-
- nr_cellid = 12345678L;
-
- ////////// Physical parameters:
-
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
- ul_prbblacklist = "51,52,53,54"
-
- pdcch_ConfigSIB1 = (
- {
- controlResourceSetZero = 12;
- searchSpaceZero = 0;
- }
- );
-
- servingCellConfigCommon = (
- {
- #spCellConfigCommon
-
- physCellId = 0;
-
-# downlinkConfigCommon
- #frequencyInfoDL
- # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
- absoluteFrequencySSB = 641280;
- dl_frequencyBand = 78;
- # this is 3600 MHz
- dl_absoluteFrequencyPointA = 640008;
- #scs-SpecificCarrierList
- dl_offstToCarrier = 0;
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- dl_subcarrierSpacing = 1;
- dl_carrierBandwidth = 106;
- #initialDownlinkBWP
- #genericParameters
- # this is RBstart=27,L=48 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 12952; # 6366 12925 12956 28875 12952
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- initialDLBWPsubcarrierSpacing = 1;
- #pdcch-ConfigCommon
- initialDLBWPcontrolResourceSetZero = 12;
- initialDLBWPsearchSpaceZero = 0;
- #pdsch-ConfigCommon
- #pdschTimeDomainAllocationList (up to 16 entries)
- initialDLBWPk0_0 = 0; #for DL slot
- initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
- initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
-
- initialDLBWPk0_1 = 0; #for mixed slot
- initialDLBWPmappingType_1 = 0;
- initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
-
- #uplinkConfigCommon
- #frequencyInfoUL
- ul_frequencyBand = 78;
- #scs-SpecificCarrierList
- ul_offstToCarrier = 0;
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- ul_subcarrierSpacing = 1;
- ul_carrierBandwidth = 106;
- pMax = 20;
- #initialUplinkBWP
- #genericParameters
- initialULBWPlocationAndBandwidth = 12952;
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- initialULBWPsubcarrierSpacing = 1;
- #rach-ConfigCommon
- #rach-ConfigGeneric
- prach_ConfigurationIndex = 98;
-#prach_msg1_FDM
-#0 = one, 1=two, 2=four, 3=eight
- prach_msg1_FDM = 0;
- prach_msg1_FrequencyStart = 0;
- zeroCorrelationZoneConfig = 13;
- preambleReceivedTargetPower = -96;
-#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
- preambleTransMax = 6;
-#powerRampingStep
-# 0=dB0,1=dB2,2=dB4,3=dB6
- powerRampingStep = 1;
-#ra_ReponseWindow
-#1,2,4,8,10,20,40,80
- ra_ResponseWindow = 4;
-#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
-#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
- ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
-#oneHalf (0..15) 4,8,12,16,...60,64
- ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
-#ra_ContentionResolutionTimer
-#(0..7) 8,16,24,32,40,48,56,64
- ra_ContentionResolutionTimer = 7;
- rsrp_ThresholdSSB = 19;
-#prach-RootSequenceIndex_PR
-#1 = 839, 2 = 139
- prach_RootSequenceIndex_PR = 2;
- prach_RootSequenceIndex = 1;
- # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
- #
- msg1_SubcarrierSpacing = 1,
-# restrictedSetConfig
-# 0=unrestricted, 1=restricted type A, 2=restricted type B
- restrictedSetConfig = 0,
-
- # pusch-ConfigCommon (up to 16 elements)
- initialULBWPk2_0 = 6; # used for UL slot
- initialULBWPmappingType_0 = 1
- initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
-
- initialULBWPk2_1 = 6; # used for mixed slot
- initialULBWPmappingType_1 = 1;
- initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4
-
- initialULBWPk2_2 = 7; # used for Msg.3 during RA
- initialULBWPmappingType_2 = 1;
- initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
-
- msg3_DeltaPreamble = 1;
- p0_NominalWithGrant =-90;
-
-# pucch-ConfigCommon setup :
-# pucchGroupHopping
-# 0 = neither, 1= group hopping, 2=sequence hopping
- pucchGroupHopping = 0;
- hoppingId = 40;
- p0_nominal = -90;
-# ssb_PositionsInBurs_BitmapPR
-# 1=short, 2=medium, 3=long
- ssb_PositionsInBurst_PR = 2;
- ssb_PositionsInBurst_Bitmap = 1;
-
-# ssb_periodicityServingCell
-# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
- ssb_periodicityServingCell = 2;
-
-# dmrs_TypeA_position
-# 0 = pos2, 1 = pos3
- dmrs_TypeA_Position = 0;
-
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- subcarrierSpacing = 1;
-
-
- #tdd-UL-DL-ConfigurationCommon
-# subcarrierSpacing
-# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
- referenceSubcarrierSpacing = 1;
- # pattern1
- # 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;
- nrofUplinkSlots = 2;
- nrofUplinkSymbols = 4;
-
- ssPBCH_BlockPower = -25;
- }
-
- );
-
-
- # ------- SCTP definitions
- SCTP :
- {
- # Number of streams to use in input/output
- SCTP_INSTREAMS = 2;
- SCTP_OUTSTREAMS = 2;
- };
-
-
- ////////// AMF parameters:
- amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
- ipv6 = "192:168:30::17";
- active = "yes";
- preference = "ipv4";
- }
- );
-
-
- NETWORK_INTERFACES :
- {
- GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0";
- GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
- GNB_INTERFACE_NAME_FOR_NGU = "eth0";
- GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
- GNB_PORT_FOR_NGU = 2152; # Spec 2152
- };
-
- }
-);
-
-MACRLCs = (
- {
- num_cc = 1;
- tr_s_preference = "local_L1";
- tr_n_preference = "local_RRC";
- pusch_TargetSNRx10 = 200;
- pucch_TargetSNRx10 = 150;
- }
-);
-
-L1s = (
- {
- num_cc = 1;
- tr_n_preference = "local_mac";
- pusch_proc_threads = 8;
- prach_dtx_threshold = 120;
- pucch0_dtx_threshold = 150;
- }
-);
-
-RUs = (
- {
- local_rf = "yes"
- nb_tx = 1
- nb_rx = 1
- att_tx = 0
- att_rx = 0;
- bands = [78];
- max_pdschReferenceSignalPower = -27;
- max_rxgain = 75;
- eNB_instances = [0];
- #beamforming 1x4 matrix:
- bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
- #clock_src = "external";
- 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"
- }
-);
-
-THREAD_STRUCT = (
- {
- #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
- parallel_config = "PARALLEL_SINGLE_THREAD";
- #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
- worker_config = "WORKER_ENABLE";
- }
-);
-
-rfsimulator :
-{
- serveraddr = "server";
- serverport = "4043";
- options = (); #("saviq"); or/and "chanmod"
- modelname = "AWGN";
- IQfile = "/tmp/rfsimulator.iqs";
-};
-
-security = {
- # preferred ciphering algorithms
- # the first one of the list that an UE supports in chosen
- # valid values: nea0, nea1, nea2, nea3
- ciphering_algorithms = ( "nea0" );
-
- # preferred integrity algorithms
- # the first one of the list that an UE supports in chosen
- # valid values: nia0, nia1, nia2, nia3
- integrity_algorithms = ( "nia2", "nia0" );
-
- # 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";
- ngap_log_level ="debug";
- ngap_log_verbosity ="medium";
- };
-
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_CU_ID = 0xe00;
+
+# cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-OAI";
+ min_rxtxtime_pdsch = 6;
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({
+ mcc = 208;
+ mnc = 97;
+ mnc_length = 2;
+ snssaiList = (
+ {
+ sst = 1;
+ sd = 0x010203; // 0 false, else true
+ },
+ {
+ sst = 1;
+ sd = 0x112233; // 0 false, else true
+ }
+ );
+ });
+
+ nr_cellid = 12345678L
+
+# tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ #pusch_TargetSNRx10 = 200;
+ #pucch_TargetSNRx10 = 200;
+ ul_prbblacklist = "51,52,53,54"
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 11;
+ searchSpaceZero = 0;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
+ #absoluteFrequencySSB = 620640;
+ # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+ absoluteFrequencySSB = 621312;
+ # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
+ #absoluteFrequencySSB = 634080;
+ # this is 3600.48 MHz
+ #absoluteFrequencySSB = 640032;
+ #dl_frequencyBand = 78;
+ # this is 3301.68 MHz
+ #dl_absoluteFrequencyPointA = 620112;
+ # this is 3300.60 MHz
+ dl_absoluteFrequencyPointA = 620040;
+ # this is 3502.56 MHz
+ #dl_absoluteFrequencyPointA = 633552;
+ # this is 3600.48 MHz
+ #dl_absoluteFrequencyPointA = 640032;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=106 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=1,L=5
+ initialDLBWPstartSymbolAndLength_1 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 12;
+ preambleReceivedTargetPower = -104;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=2 L=13
+ initialULBWPstartSymbolAndLength_0 = 41;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=4
+ initialULBWPstartSymbolAndLength_1 = 52;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # 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;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ 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";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 2;
+ prach_dtx_threshold = 120;
+# pucch0_dtx_threshold = 150;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+ sf_extension = 0
+ 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"
+ }
+);
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # 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";
+ };
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index 4f0f7c6b2e..4200300c50 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -21,9 +21,10 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ min_rxtxtime_pdsch = 6;
servingCellConfigCommon = (
{
@@ -124,7 +125,7 @@ gNBs =
initialULBWPk2_1 = 6; # used for mixed slot
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
initialULBWPmappingType_2 = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index a72147ee99..015d9ee0d0 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -250,6 +250,7 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 111;
eNB_instances = [0];
+# sdr_addrs = "serial=30C51D4";
# clock_src = "external";
}
);
diff --git a/ci-scripts/conf_files/ue.sa.conf b/ci-scripts/conf_files/ue.sa.conf
new file mode 100644
index 0000000000..3e6f78f709
--- /dev/null
+++ b/ci-scripts/conf_files/ue.sa.conf
@@ -0,0 +1,8 @@
+uicc0 = {
+ imsi = "208970100001127";
+ key = "fec86ba6eb707ed08905757b1bb44b8f";
+ opc= "c42449363bbad02b66d16bc975d77cc1";
+ dnn= "oai";
+ nssai_sst=1;
+ nssai_sd=66051;
+}
diff --git a/ci-scripts/datalog_rt_stats.yaml b/ci-scripts/datalog_rt_stats.yaml
index 507ea5d182..a2d4768752 100644
--- a/ci-scripts/datalog_rt_stats.yaml
+++ b/ci-scripts/datalog_rt_stats.yaml
@@ -17,7 +17,7 @@ Ref :
DLSCH encoding : 230.0
L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0
- PUSCH decoding : 140.0
+ PUSCH decoding : 180.0
DL & UL scheduling timing stats : 37.0
UL Indication : 38.0
Threshold :
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index 0ae636e4f8..a7d923ca90 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -773,7 +773,7 @@ class EPCManagement():
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
else:
logging.debug('Undeployment went wrong')
- HTML.CreateHtmlTestRowQueu(self.Type, 'KO', 1, html_queue)
+ HTML.CreateHtmlTestRowQueue(self.Type, 'KO', 1, html_queue)
def LogCollectHSS(self):
mySSH = SSH.SSHConnection()
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 90fece4381..207e62bf9c 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -965,7 +965,7 @@ class RANManagement():
if result is not None:
mbmsRequestMsg += 1
#FR1 NSA test : add new markers to make sure gNB is used
- result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI [0-9a-fA-F]+ received correctly, adding UE MAC Context UE_id [0-9]+\/RNTI [0-9a-fA-F]+', str(line))
+ result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI 0x[0-9a-fA-F]+ received correctly, adding UE MAC Context UE_id [0-9]+\/RNTI 0x[0-9a-fA-F]+', str(line))
if result is not None:
NSA_RAPROC_PUSCH_check = 1
#dlsch and ulsch statistics
diff --git a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml
index 071b9e2e67..144fcd25a5 100644
--- a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml
+++ b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml
@@ -18,4 +18,14 @@ SA-N310 :
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G'
bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)'
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)'
diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py
index 65e9c961d0..67e0b832e6 100644
--- a/ci-scripts/sshconnection.py
+++ b/ci-scripts/sshconnection.py
@@ -100,7 +100,7 @@ class SSHConnection():
time.sleep(1)
count += 1
if connect_status:
- pass
+ self.command('unset HISTFILE', '\$', 5, silent=True)
else:
sys.exit('SSH Connection Failed')
self.ipaddress = ipaddress
diff --git a/ci-scripts/xml_files/fr1_gnb_build.xml b/ci-scripts/xml_files/fr1_gnb_build.xml
index 43cff75620..13d85fccc4 100644
--- a/ci-scripts/xml_files/fr1_gnb_build.xml
+++ b/ci-scripts/xml_files/fr1_gnb_build.xml
@@ -38,11 +38,4 @@
True
-
- WaitEndBuild_eNB
- Wait for end of Build gNB
- 0
- 0
-
-
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
index bdca76379d..86af12b53e 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
@@ -74,7 +74,7 @@
Initialize_eNB
Initialize gNB
- -O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6
+ -O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1
1
1
nr
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
index ebb5c880d5..2d17ff38e2 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
@@ -94,7 +94,7 @@
Initialize_eNB
Initialize gNB
- -O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6
+ -O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1
1
1
nr
diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml
index ba1e478efc..2b64b9bbe5 100644
--- a/ci-scripts/xml_files/fr1_nsa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml
@@ -73,7 +73,7 @@
Initialize_eNB
Initialize gNB
- -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --usrp-args "serial=30C51D4"
+ -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --RUs.[0].sdr_addrs "serial=30C51D4"
1
1
nr
diff --git a/ci-scripts/xml_files/fr1_sa_oaiue_b200.xml b/ci-scripts/xml_files/fr1_sa_oaiue_b200.xml
new file mode 100644
index 0000000000..6c359abb8d
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_sa_oaiue_b200.xml
@@ -0,0 +1,123 @@
+
+
+ TEST-SA-FR1-Tab1
+ SA Ping DL UL with OAI NR UE
+ tasks
+ 1
+
+ 040000
+ 000002
+ 010000
+ 000002
+ 050000
+ 050001
+ 000001
+ 010002
+ 080000
+
+
+
+
+ Initialize_OAI_UE
+ Initialize OAI UE
+ nr
+ --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
+
+
+
+ Terminate_OAI_UE
+ Terminate OAI UE
+
+
+
+
+ Initialize_eNB
+ Initialize gNB
+ -O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa -q --usrp-tx-thread-config 1
+ 0
+ 0
+ nr
+ yes
+ yes
+ 192.168.18.240
+
+
+
+ IdleSleep
+ Sleep
+ 5
+
+
+
+ IdleSleep
+ Sleep
+ 20
+
+
+
+
+ Ping
+ Ping from CN to UE: 20pings in 20sec
+ -c 20
+ 5
+
+
+
+ Ping
+ Ping from CN to UE: 100pings in 20sec
+ -c 100 -i 0.2
+ 5
+
+
+
+ Iperf
+ iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 60M -t 60
+ DL
+ nrmodule2_quectel
+ 5
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 3M -t 60
+ UL
+ nrmodule2_quectel
+ 5
+ single-ue
+
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ 0
+ 0
+ nr
+
+
+
+
diff --git a/ci-scripts/xml_files/fr1_sa_oaiue_n310.xml b/ci-scripts/xml_files/fr1_sa_oaiue_n310.xml
new file mode 100644
index 0000000000..28eee1e224
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_sa_oaiue_n310.xml
@@ -0,0 +1,123 @@
+
+
+ TEST-SA-FR1-Tab1
+ SA Ping DL UL with OAI NR UE
+ tasks
+ 1
+
+ 040000
+ 000002
+ 010000
+ 000002
+ 050000
+ 050001
+ 000001
+ 010002
+ 080000
+
+
+
+
+ Initialize_OAI_UE
+ Initialize OAI UE
+ nr
+ --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
+
+
+
+ Terminate_OAI_UE
+ Terminate OAI UE
+
+
+
+
+ Initialize_eNB
+ Initialize gNB
+ -O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1
+ 0
+ 0
+ nr
+ yes
+ yes
+ 192.168.18.240
+
+
+
+ IdleSleep
+ Sleep
+ 5
+
+
+
+ IdleSleep
+ Sleep
+ 20
+
+
+
+
+ Ping
+ Ping from CN to UE: 20pings in 20sec
+ -c 20
+ 5
+
+
+
+ Ping
+ Ping from CN to UE: 100pings in 20sec
+ -c 100 -i 0.2
+ 5
+
+
+
+ Iperf
+ iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 60M -t 60
+ DL
+ nrmodule2_quectel
+ 5
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 3M -t 60
+ UL
+ nrmodule2_quectel
+ 5
+ single-ue
+
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ 0
+ 0
+ nr
+
+
+
+
diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml
index ff877287aa..0564e49c5c 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel.xml
@@ -58,7 +58,7 @@
Initialize_eNB
Initialize gNB
- -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
+ -O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1
0
0
nr
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
index b2236dd527..3301efc221 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
@@ -65,7 +65,7 @@
Initialize_eNB
Initialize gNB
- -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
+ -O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1
0
0
nr
diff --git a/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
index c00cf0d2c2..4ae51158ac 100644
--- a/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
+++ b/ci-scripts/yaml_files/nsa_b200_gnb/docker-compose.yml
@@ -26,7 +26,7 @@ services:
FLEXRAN_INTERFACE_NAME: eth0
FLEXRAN_IPV4_ADDRESS: 192.168.18.210
THREAD_PARALLEL_CONFIG: PARALLEL_RU_L1_TRX_SPLIT
- USE_ADDITIONAL_OPTIONS: '-E -q --usrp-args "serial=30C51D4"'
+ USE_ADDITIONAL_OPTIONS: -E -q --RUs.[0].sdr_addrs serial=30C51D4
volumes:
- /dev:/dev
networks:
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index cd66be73f5..192bf8cc37 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -155,6 +155,10 @@ ID = GNB_MAC_DL_RAR_PDU_WITH_DATA
DESC = NR MAC downlink PDU for RAR
GROUP = ALL:MAC:GNB:WIRESHARK
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
+ID = GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA
+ DESC = NR MAC downlink retransmitted PDU for an UE
+ GROUP = ALL:MAC:GNB:WIRESHARK
+ FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : int,round : buffer,data
#RLC logs
ID = ENB_RLC_DL
diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c
index d04f2c317d..b9284748e4 100644
--- a/common/utils/T/tracer/macpdu2wireshark.c
+++ b/common/utils/T/tracer/macpdu2wireshark.c
@@ -59,12 +59,20 @@ typedef struct {
int nr_ul_rnti;
int nr_ul_frame;
int nr_ul_slot;
+ int nr_ul_harq_pid;
int nr_ul_data;
/* NR dl */
int nr_dl_rnti;
int nr_dl_frame;
int nr_dl_slot;
+ int nr_dl_harq_pid;
int nr_dl_data;
+ /* NR dl retx */
+ int nr_dl_retx_rnti;
+ int nr_dl_retx_frame;
+ int nr_dl_retx_slot;
+ int nr_dl_retx_harq_pid;
+ int nr_dl_retx_data;
/* NR mib */
int nr_mib_frame;
int nr_mib_slot;
@@ -254,6 +262,7 @@ void sr(void *_d, event e)
#define MAC_NR_PAYLOAD_TAG 0x01
#define MAC_NR_RNTI_TAG 0x02
#define MAC_NR_UEID_TAG 0x03
+#define MAC_NR_HARQID 0x06
#define MAC_NR_FRAME_SLOT_TAG 0x07
#define NR_FDD_RADIO 1
@@ -267,7 +276,8 @@ void sr(void *_d, event e)
#define NR_C_RNTI 3
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
- int frame, int slot, void *buf, int bufsize, int preamble)
+ int frame, int slot, int harq_pid, void *buf, int bufsize,
+ int preamble)
{
ssize_t ret;
int i;
@@ -307,6 +317,8 @@ void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
PUTC(&d->buf, frame & 255);
PUTC(&d->buf, (slot>>8) & 255);
PUTC(&d->buf, slot & 255);
+ PUTC(&d->buf, MAC_NR_HARQID);
+ PUTC(&d->buf, harq_pid);
#endif
PUTC(&d->buf, MAC_NR_PAYLOAD_TAG);
@@ -326,7 +338,8 @@ void nr_ul(void *_d, event e)
trace_nr(d, NR_DIRECTION_UPLINK, NR_C_RNTI, e.e[d->nr_ul_rnti].i,
e.e[d->nr_ul_frame].i, e.e[d->nr_ul_slot].i,
- e.e[d->nr_ul_data].b, e.e[d->nr_ul_data].bsize, NO_PREAMBLE);
+ e.e[d->nr_ul_harq_pid].i, e.e[d->nr_ul_data].b,
+ e.e[d->nr_ul_data].bsize, NO_PREAMBLE);
}
void nr_dl(void *_d, event e)
@@ -335,7 +348,18 @@ void nr_dl(void *_d, event e)
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
- e.e[d->nr_dl_data].b, e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
+ e.e[d->nr_dl_harq_pid].i, e.e[d->nr_dl_data].b,
+ e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
+}
+
+void nr_dl_retx(void *_d, event e)
+{
+ ev_data *d = _d;
+
+ trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_retx_rnti].i,
+ e.e[d->nr_dl_retx_frame].i, e.e[d->nr_dl_retx_slot].i,
+ e.e[d->nr_dl_retx_harq_pid].i, e.e[d->nr_dl_retx_data].b,
+ e.e[d->nr_dl_retx_data].bsize, NO_PREAMBLE);
}
void nr_mib(void *_d, event e)
@@ -349,7 +373,7 @@ void nr_mib(void *_d, event e)
d->cur_mib++;
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_NO_RNTI, 0,
- e.e[d->nr_mib_frame].i, e.e[d->nr_mib_slot].i,
+ e.e[d->nr_mib_frame].i, e.e[d->nr_mib_slot].i, 0 /* harq pid */,
e.e[d->nr_mib_data].b, e.e[d->nr_mib_data].bsize, NO_PREAMBLE);
}
@@ -358,7 +382,7 @@ void nr_rar(void *_d, event e)
ev_data *d = _d;
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_RA_RNTI, e.e[d->nr_rar_rnti].i,
- e.e[d->nr_rar_frame].i, e.e[d->nr_rar_slot].i,
+ e.e[d->nr_rar_frame].i, e.e[d->nr_rar_slot].i, 0 /* harq pid */,
e.e[d->nr_rar_data].b, e.e[d->nr_rar_data].bsize, NO_PREAMBLE);
}
@@ -367,47 +391,55 @@ void nr_rar(void *_d, event e)
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
int preamble_id, int rar_id, int sr_id,
- int nr_ul_id, int nr_dl_id, int nr_mib_id, int nr_rar_id)
+ int nr_ul_id, int nr_dl_id, int nr_dl_retx_id, int nr_mib_id,
+ int nr_rar_id)
{
database_event_format f;
int i;
- d->ul_rnti = -1;
- d->ul_frame = -1;
- d->ul_subframe = -1;
- d->ul_data = -1;
- d->dl_rnti = -1;
- d->dl_frame = -1;
- d->dl_subframe = -1;
- d->dl_data = -1;
- d->mib_frame = -1;
- d->mib_subframe = -1;
- d->mib_data = -1;
- d->preamble_frame = -1;
- d->preamble_subframe = -1;
- d->preamble_preamble = -1;
- d->rar_rnti = -1;
- d->rar_frame = -1;
- d->rar_subframe = -1;
- d->rar_data = -1;
- d->sr_rnti = -1;
- d->sr_frame = -1;
- d->sr_subframe = -1;
+ d->ul_rnti = -1;
+ d->ul_frame = -1;
+ d->ul_subframe = -1;
+ d->ul_data = -1;
+ d->dl_rnti = -1;
+ d->dl_frame = -1;
+ d->dl_subframe = -1;
+ d->dl_data = -1;
+ d->mib_frame = -1;
+ d->mib_subframe = -1;
+ d->mib_data = -1;
+ d->preamble_frame = -1;
+ d->preamble_subframe = -1;
+ d->preamble_preamble = -1;
+ d->rar_rnti = -1;
+ d->rar_frame = -1;
+ d->rar_subframe = -1;
+ d->rar_data = -1;
+ d->sr_rnti = -1;
+ d->sr_frame = -1;
+ d->sr_subframe = -1;
- d->nr_ul_rnti = -1;
- d->nr_ul_frame = -1;
- d->nr_ul_slot = -1;
- d->nr_ul_data = -1;
- d->nr_dl_rnti = -1;
- d->nr_dl_frame = -1;
- d->nr_dl_slot = -1;
- d->nr_dl_data = -1;
- d->nr_mib_frame = -1;
- d->nr_mib_slot = -1;
- d->nr_mib_data = -1;
- d->nr_rar_rnti = -1;
- d->nr_rar_frame = -1;
- d->nr_rar_slot = -1;
- d->nr_rar_data = -1;
+ d->nr_ul_rnti = -1;
+ d->nr_ul_frame = -1;
+ d->nr_ul_slot = -1;
+ d->nr_ul_harq_pid = -1;
+ d->nr_ul_data = -1;
+ d->nr_dl_rnti = -1;
+ d->nr_dl_frame = -1;
+ d->nr_dl_slot = -1;
+ d->nr_dl_harq_pid = -1;
+ d->nr_dl_data = -1;
+ d->nr_dl_retx_rnti = -1;
+ d->nr_dl_retx_frame = -1;
+ d->nr_dl_retx_slot = -1;
+ d->nr_dl_retx_harq_pid = -1;
+ d->nr_dl_retx_data = -1;
+ d->nr_mib_frame = -1;
+ d->nr_mib_slot = -1;
+ d->nr_mib_data = -1;
+ d->nr_rar_rnti = -1;
+ d->nr_rar_frame = -1;
+ d->nr_rar_slot = -1;
+ d->nr_rar_data = -1;
#define G(var_name, var_type, var) \
if (!strcmp(f.name[i], var_name)) { \
@@ -490,32 +522,50 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
if (d->sr_rnti == -1 || d->sr_frame == -1 || d->sr_subframe == -1)
goto error;
- /* NR ul: rnti, frame, slot, data */
+ /* NR ul: rnti, frame, slot, harq_pid, data */
f = get_format(database, nr_ul_id);
for (i = 0; i < f.count; i++) {
- G("rnti", "int", d->nr_ul_rnti);
- G("frame", "int", d->nr_ul_frame);
- G("slot", "int", d->nr_ul_slot);
- G("data", "buffer", d->nr_ul_data);
+ G("rnti", "int", d->nr_ul_rnti);
+ G("frame", "int", d->nr_ul_frame);
+ G("slot", "int", d->nr_ul_slot);
+ G("harq_pid", "int", d->nr_ul_harq_pid);
+ G("data", "buffer", d->nr_ul_data);
}
if (d->nr_ul_rnti == -1 || d->nr_ul_frame == -1 || d->nr_ul_slot == -1 ||
- d->nr_ul_data == -1)
+ d->nr_ul_harq_pid == -1 || d->nr_ul_data == -1)
goto error;
- /* NR dl: rnti, frame, slot, data */
+ /* NR dl: rnti, frame, slot, harq_pid, data */
f = get_format(database, nr_dl_id);
for (i = 0; i < f.count; i++) {
- G("rnti", "int", d->nr_dl_rnti);
- G("frame", "int", d->nr_dl_frame);
- G("slot", "int", d->nr_dl_slot);
- G("data", "buffer", d->nr_dl_data);
+ G("rnti", "int", d->nr_dl_rnti);
+ G("frame", "int", d->nr_dl_frame);
+ G("slot", "int", d->nr_dl_slot);
+ G("harq_pid", "int", d->nr_dl_harq_pid);
+ G("data", "buffer", d->nr_dl_data);
}
if (d->nr_dl_rnti == -1 || d->nr_dl_frame == -1 || d->nr_dl_slot == -1 ||
- d->nr_dl_data == -1)
+ d->nr_dl_harq_pid == -1 || d->nr_dl_data == -1)
+ goto error;
+
+ /* NR dl retx: rnti, frame, slot, harq_pid, data */
+ f = get_format(database, nr_dl_retx_id);
+
+ for (i = 0; i < f.count; i++) {
+ G("rnti", "int", d->nr_dl_retx_rnti);
+ G("frame", "int", d->nr_dl_retx_frame);
+ G("slot", "int", d->nr_dl_retx_slot);
+ G("harq_pid", "int", d->nr_dl_retx_harq_pid);
+ G("data", "buffer", d->nr_dl_retx_data);
+ }
+
+ if (d->nr_dl_retx_rnti == -1 || d->nr_dl_retx_frame == -1 ||
+ d->nr_dl_retx_slot == -1 || d->nr_dl_retx_harq_pid == -1 ||
+ d->nr_dl_retx_data == -1)
goto error;
/* NR MIB: frame, slot, data */
@@ -612,7 +662,7 @@ int main(int n, char **v)
int in;
int i;
int ul_id, dl_id, mib_id, preamble_id, rar_id;
- int nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id;
+ int nr_ul_id, nr_dl_id, nr_dl_retx_id, nr_mib_id, nr_rar_id;
int sr_id;
ev_data d;
char *ip = DEFAULT_IP;
@@ -692,6 +742,7 @@ int main(int n, char **v)
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
+ on_off(database, "GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA", is_on, 1);
on_off(database, "GNB_PHY_MIB", is_on, 1);
on_off(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA", is_on, 1);
@@ -715,11 +766,12 @@ int main(int n, char **v)
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
+ nr_dl_retx_id = event_id_from_name(database, "GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA");
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id, sr_id,
- nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id);
+ nr_ul_id, nr_dl_id, nr_dl_retx_id, nr_mib_id, nr_rar_id);
register_handler_function(h, ul_id, ul, &d);
register_handler_function(h, dl_id, dl, &d);
@@ -730,6 +782,7 @@ int main(int n, char **v)
register_handler_function(h, nr_ul_id, nr_ul, &d);
register_handler_function(h, nr_dl_id, nr_dl, &d);
+ register_handler_function(h, nr_dl_retx_id, nr_dl_retx, &d);
register_handler_function(h, nr_mib_id, nr_mib, &d);
register_handler_function(h, nr_rar_id, nr_rar, &d);
@@ -753,10 +806,11 @@ int main(int n, char **v)
if (e.type == -1) break;
- if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
- e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
- e.type == nr_ul_id || e.type == nr_dl_id ||
- e.type == nr_mib_id || e.type == nr_rar_id)) continue;
+ if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
+ e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
+ e.type == nr_ul_id || e.type == nr_dl_id ||
+ e.type == nr_dl_retx_id || e.type == nr_mib_id ||
+ e.type == nr_rar_id)) continue;
handle_event(h, e);
}
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index cf748784e5..360bf2e7cf 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -96,6 +96,7 @@ COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 .
RUN ldconfig
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index cfd9d82144..030ce80ede 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -100,6 +100,7 @@ COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 .
RUN ldconfig
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 6d54ab08fc..31a3ae41ae 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -101,6 +101,7 @@ COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 .
RUN ldconfig
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 49e3f3213b..38d437940c 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -102,6 +102,7 @@ COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 .
RUN ldconfig
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index f83fac2737..e9fc06ce4a 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -200,7 +200,7 @@ void rx_func(void *param) {
int down_removed = 0;
int pucch_removed = 0;
for (int i = 0; i < rnti_to_remove_count; i++) {
- LOG_W(NR_PHY, "to remove rnti %d\n", rnti_to_remove[i]);
+ LOG_W(NR_PHY, "to remove rnti 0x%04x\n", rnti_to_remove[i]);
void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch);
void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
int j;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 77fc7d171b..60ff40abeb 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -778,12 +778,6 @@ void init_NR_UE_threads(int nb_inst) {
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
-
- if(get_nrUE_params()->nr_dlsch_parallel)
- {
- pthread_t dlsch0_threads;
- threadCreate(&dlsch0_threads, dlsch_thread, (void *)UE, "DLthread", -1, OAI_PRIORITY_RT_MAX-1);
- }
}
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index ba67822b9f..b776d44224 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -135,8 +135,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
dci_pdu->AggregationLevel,
0,NULL);
polar_encoder_fast((uint64_t*)dci_pdu->Payload, (void*)encoder_output, n_RNTI,1,currentPtr);
-#if DEBUG_CHANNEL_CODING
- printf("polar rnti %x,length %d, L %d\n",n_RNTI, dci_pdu->PayloadSizeBits,dci_pdu->AggregationLevel);
+#ifdef DEBUG_CHANNEL_CODING
+ 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",
((uint64_t*)dci_pdu->Payload)[0], ((uint64_t*)dci_pdu->Payload)[1]);
printf("Encoded Payload (length:%d dwords):\n", encoded_length>>5);
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 2491c24ab6..b81e655817 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -429,8 +429,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
uci_pdu->harq->num_harq = 1;
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
- uci_pdu->harq->harq_list[0].harq_value = index&0x01;
- LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d, energy %f, sync_pos %d\n",
+ uci_pdu->harq->harq_list[0].harq_value = !(index&0x01);
+ LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %d (0 pass, 1 fail) with confidence level %d (0 is good, 1 is bad) xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d, energy %f, sync_pos %d\n",
frame,slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,10*log10((double)sigenergy),gNB->ulsch_stats[0].sync_pos);
if (pucch_pdu->sr_flag == 1) {
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
@@ -445,9 +445,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
uci_pdu->harq->num_harq = 2;
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
- uci_pdu->harq->harq_list[1].harq_value = index&0x01;
- uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
- LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d, xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n",
+ uci_pdu->harq->harq_list[1].harq_value = !(index&0x01);
+ uci_pdu->harq->harq_list[0].harq_value = !((index>>1)&0x01);
+ LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d (0 pass, 1 fail) and %d with confidence level %d (0 is good, 1 is bad), xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n",
frame,slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,gNB->ulsch_stats[0].sync_pos);
if (pucch_pdu->sr_flag == 1) {
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 975d7077a0..b8cd59eead 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -47,6 +47,7 @@
//#define ENABLE_PHY_PAYLOAD_DEBUG 1
+#define OAI_UL_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX = 68*384
//#define OAI_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX
static uint64_t nb_total_decod =0;
@@ -58,23 +59,26 @@ int nbDlProcessing =0;
static tpool_t pool_dl;
-
//extern double cpuf;
+
void init_dlsch_tpool(uint8_t num_dlsch_threads) {
- if( num_dlsch_threads==0)
- return;
+ char *params = NULL;
- char *params=calloc(1,(num_dlsch_threads*3)+1);
-
- for (int i=0; iharq_process;
+ NR_UE_DLSCH_t *dlsch = (NR_UE_DLSCH_t *) rdata->dlsch;
+ int r = rdata->segment_r;
+
+ bool decodeSuccess = (rdata->decodeIterations < (1+dlsch->max_ldpc_iterations));
+
+ if (decodeSuccess) {
+ memcpy(harq_process->b+rdata->offset,
+ harq_process->c[r],
+ rdata->Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0));
+
+ } else {
+ if ( !last ) {
+ int nb=abortTpool(&(pool_dl), req->key);
+ nb+=abortNotifiedFIFO(nf_p, req->key);
+ LOG_D(PHY,"downlink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb);
+ LOG_D(PHY, "DLSCH %d in error\n",rdata->dlsch_id);
+ last = true;
+ }
+ }
+
+ // if all segments are done
+ if (last) {
+ if (decodeSuccess) {
+ //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
+ // phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
+ harq_process->status = SCH_IDLE;
+ harq_process->round = 0;
+ harq_process->ack = 1;
+
+ //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
+ // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
+
+ //if(is_crnti) {
+ // LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
+ //}
+ dlsch->last_iteration_cnt = rdata->decodeIterations;
+ LOG_D(PHY, "DLSCH received ok \n");
+ } else {
+ //LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
+ // phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+ harq_process->ack = 0;
+ harq_process->round++;
+ if (harq_process->round >= dlsch->Mlimit) {
+ harq_process->status = SCH_IDLE;
+ harq_process->round = 0;
+ phy_vars_ue->dl_stats[4]++;
+ }
+
+ //if(is_crnti) {
+ // LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+ // phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
+ //}
+ dlsch->last_iteration_cnt = dlsch->max_ldpc_iterations + 1;
+ LOG_D(PHY, "DLSCH received nok \n");
+ }
+ return true; //stop
+ }
+ else
+ {
+ return false; //not last one
+ }
+}
+
+void nr_processDLSegment(void* arg) {
+ ldpcDecode_ue_t *rdata = (ldpcDecode_ue_t*) arg;
+ NR_UE_DLSCH_t *dlsch = rdata->dlsch;
+#if UE_TIMING_TRACE //TBD
+ PHY_VARS_NR_UE *phy_vars_ue = rdata->phy_vars_ue;
+ time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
+ time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
+ time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
+#endif
+ NR_DL_UE_HARQ_t *harq_process= rdata->harq_process;
+ t_nrLDPC_dec_params *p_decoderParms = &rdata->decoderParms;
+ int length_dec;
+ int no_iteration_ldpc;
+ int Kr;
+ int Kr_bytes;
+ int K_bits_F;
+ uint8_t crc_type;
+ int i;
+ int j;
+ int r = rdata->segment_r;
+ int A = rdata->A;
+ int E = rdata->E;
+ int Qm = rdata->Qm;
+ //int rv_index = rdata->rv_index;
+ int r_offset = rdata->r_offset;
+ uint8_t kc = rdata->Kc;
+ uint32_t Tbslbrm = rdata->Tbslbrm;
+ short* dlsch_llr = rdata->dlsch_llr;
+ rdata->decodeIterations = dlsch->max_ldpc_iterations + 1;
+ int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
+
+ int16_t z [68*384 + 16] __attribute__ ((aligned(16)));
+ int8_t l [68*384 + 16] __attribute__ ((aligned(16)));
+
+ __m128i *pv = (__m128i*)&z;
+ __m128i *pl = (__m128i*)&l;
+
+ uint8_t Ilbrm = 0;
+
+ Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
+ Kr_bytes = Kr>>3;
+ K_bits_F = Kr-harq_process->F;
+
+ t_nrLDPC_time_stats procTime = {0};
+ t_nrLDPC_time_stats* p_procTime = &procTime ;
+
+ t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
+
+#if UE_TIMING_TRACE
+ start_meas(dlsch_deinterleaving_stats);
+#endif
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
+ nr_deinterleaving_ldpc(E,
+ Qm,
+ harq_process->w[r], // [hna] w is e
+ dlsch_llr+r_offset);
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_deinterleaving_stats);
+#endif
+#if UE_TIMING_TRACE
+ start_meas(dlsch_rate_unmatching_stats);
+#endif
+ /* LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
+ harq_pid,r, G,E,harq_process->F,
+ Kr*3,
+ harq_process->TBS,
+ Qm,
+ harq_process->nb_rb,
+ harq_process->Nl,
+ harq_process->rvidx,
+ harq_process->round); */
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
+
+ if (nr_rate_matching_ldpc_rx(Ilbrm,
+ Tbslbrm,
+ p_decoderParms->BG,
+ p_decoderParms->Z,
+ harq_process->d[r],
+ harq_process->w[r],
+ harq_process->C,
+ harq_process->rvidx,
+ (harq_process->first_rx==1)?1:0,
+ E,
+ harq_process->F,
+ Kr-harq_process->F-2*(p_decoderParms->Z))==-1) {
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_rate_unmatching_stats);
+#endif
+ LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
+ rdata->decodeIterations = dlsch->max_ldpc_iterations + 1;
+ return;
+ } else {
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_rate_unmatching_stats);
+#endif
+ }
+
+ r_offset += E;
+
+ if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+ LOG_I(PHY,"decoder input(segment %u) :",r);
+
+ for (int i=0; id[r][i]);
+
+ LOG_D(PHY,"\n");
+ }
+
+ memset(harq_process->c[r],0,Kr_bytes);
+
+ if (harq_process->C == 1) {
+ if (A > NR_MAX_PDSCH_TBS)
+ crc_type = CRC24_A;
+ else
+ crc_type = CRC16;
+
+ length_dec = harq_process->B;
+ } else {
+ crc_type = CRC24_B;
+ length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
+ }
+
+ {
+#if UE_TIMING_TRACE
+ start_meas(dlsch_turbo_decoding_stats);
+#endif
+ //set first 2*Z_c bits to zeros
+ memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+ //set Filler bits
+ memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+ //Move coded bits before filler bits
+ memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+ //skip filler bits
+ memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+
+ //Saturate coded bits before decoding into 8 bits values
+ for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
+ pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
+ }
+
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
+ p_decoderParms->block_length=length_dec;
+ nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf);
+ no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
+ (int8_t *)&pl[0],
+ llrProcBuf,
+ p_nrLDPC_procBuf[r],
+ p_procTime);
+ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
+
+ // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
+ if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
+ LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
+
+ if (r==0) {
+ for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
+ }
+
+ //Temporary hack
+ no_iteration_ldpc = dlsch->max_ldpc_iterations;
+ rdata->decodeIterations = no_iteration_ldpc;
+ } else {
+ LOG_D(PHY,"CRC NOT OK\n\033[0m");
+ }
+
+ nb_total_decod++;
+
+ if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
+ nb_error_decod++;
+ }
+
+ for (int m=0; m < Kr>>3; m ++) {
+ harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
+ }
+
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_turbo_decoding_stats);
+#endif
+ }
+}
+
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
UE_nr_rxtx_proc_t *proc,
int eNB_id,
@@ -236,36 +489,21 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag) {
- time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
- time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
- time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
-
uint32_t A,E;
uint32_t G;
uint32_t ret,offset;
- int32_t no_iteration_ldpc, length_dec;
- uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bits_F,err_flag=0;
- uint8_t crc_type;
- int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
+ uint32_t r,r_offset=0,Kr=8424,Kr_bytes;
t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params *p_decParams = &decParams;
- t_nrLDPC_time_stats procTime = {0};
- t_nrLDPC_time_stats *p_procTime =&procTime ;
if (!harq_process) {
LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
return(dlsch->max_ldpc_iterations + 1);
}
- t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
// HARQ stats
phy_vars_ue->dl_stats[harq_process->round]++;
- int16_t z [68*384];
- int8_t l [68*384];
- //__m128i l;
- //int16_t inv_d [68*384];
uint8_t kc;
- uint8_t Ilbrm = 1;
uint32_t Tbslbrm;// = 950984;
uint16_t nb_rb;// = 30;
double Coderate;// = 0.0;
@@ -280,13 +518,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
}
uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
- uint32_t i,j;
- __m128i *pv = (__m128i *)&z;
- __m128i *pl = (__m128i *)&l;
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
//NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
-
+
+ int nbDecode = 0;
+
if (!dlsch_llr) {
LOG_E(PHY,"dlsch_decoding.c: NULL dlsch_llr pointer\n");
return(dlsch->max_ldpc_iterations + 1);
@@ -378,6 +615,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
}
+ if ((harq_process->Nl)<4)
+ Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
+ else
+ Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
p_decParams->Z = harq_process->Z;
@@ -385,7 +626,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
//printf("coderate %f kc %d \n", Coderate, kc);
p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
p_decParams->outMode= 0;
- err_flag = 0;
r_offset = 0;
uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
@@ -405,1016 +645,54 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
opp_enabled=1;
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
Kr_bytes = Kr>>3;
- K_bits_F = Kr-harq_process->F;
-
+ offset = 0;
+ void (*nr_processDLSegment_ptr)(void*) = &nr_processDLSegment;
+ notifiedFIFO_t nf;
+ initNotifiedFIFO(&nf);
for (r=0; rC; r++) {
//printf("start rx segment %d\n",r);
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
- start_meas(dlsch_deinterleaving_stats);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
- nr_deinterleaving_ldpc(E,
- harq_process->Qm,
- harq_process->w[r], // [hna] w is e
- dlsch_llr+r_offset);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
- stop_meas(dlsch_deinterleaving_stats);
- start_meas(dlsch_rate_unmatching_stats);
- LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
- harq_pid,r, G,E,harq_process->F,
- Kr*3,
- harq_process->TBS,
- harq_process->Qm,
- harq_process->nb_rb,
- harq_process->Nl,
- harq_process->rvidx,
- harq_process->round);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
-
- if ((harq_process->Nl)<4)
- Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
- else
- Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
-
- if (nr_rate_matching_ldpc_rx(Ilbrm,
- Tbslbrm,
- p_decParams->BG,
- p_decParams->Z,
- harq_process->d[r],
- harq_process->w[r],
- harq_process->C,
- harq_process->rvidx,
- (harq_process->first_rx==1)?1:0,
- E,
- harq_process->F,
- Kr-harq_process->F-2*(p_decParams->Z))==-1) {
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
- stop_meas(dlsch_rate_unmatching_stats);
- LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
- return(dlsch->max_ldpc_iterations + 1);
- } else {
- stop_meas(dlsch_rate_unmatching_stats);
- }
+ union ldpcReqUnion id = {.s={dlsch->rnti,frame,nr_slot_rx,0,0}};
+ notifiedFIFO_elt_t *req=newNotifiedFIFO_elt(sizeof(ldpcDecode_ue_t), id.p, &nf, nr_processDLSegment_ptr);
+ ldpcDecode_ue_t * rdata=(ldpcDecode_ue_t *) NotifiedFifoData(req);
+ rdata->phy_vars_ue = phy_vars_ue;
+ rdata->harq_process = harq_process;
+ rdata->decoderParms = decParams;
+ rdata->dlsch_llr = dlsch_llr;
+ rdata->Kc = kc;
+ rdata->harq_pid = harq_pid;
+ rdata->segment_r = r;
+ rdata->nbSegments = harq_process->C;
+ rdata->E = E;
+ rdata->A = A;
+ rdata->Qm = harq_process->Qm;
+ rdata->r_offset = r_offset;
+ rdata->Kr_bytes = Kr_bytes;
+ rdata->rv_index = harq_process->rvidx;
+ rdata->Tbslbrm = Tbslbrm;
+ rdata->offset = offset;
+ rdata->dlsch = dlsch;
+ rdata->dlsch_id = 0;
+ pushTpool(&(pool_dl),req);
+ nbDecode++;
+ LOG_D(PHY,"Added a block to decode, in pipe: %d\n",nbDecode);
r_offset += E;
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- LOG_I(PHY,"decoder input(segment %u) :",r);
-
- for (int i=0; id[r][i]);
-
- LOG_D(PHY,"\n");
- }
-
- memset(harq_process->c[r],0,Kr_bytes);
-
- if (harq_process->C == 1) {
- if (A > NR_MAX_PDSCH_TBS)
- crc_type = CRC24_A;
- else
- crc_type = CRC16;
-
- length_dec = harq_process->B;
- } else {
- crc_type = CRC24_B;
- length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
- }
-
- if (err_flag == 0) {
- start_meas(dlsch_turbo_decoding_stats);
- //set first 2*Z_c bits to zeros
- memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
- //set Filler bits
- memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
- //Move coded bits before filler bits
- memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
- //skip filler bits
- memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-
- //Saturate coded bits before decoding into 8 bits values
- for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
- pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
- }
-
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
- p_decParams->block_length=length_dec;
- nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
- no_iteration_ldpc = nrLDPC_decoder(p_decParams,
- (int8_t *)&pl[0],
- llrProcBuf,
- p_nrLDPC_procBuf[r],
- p_procTime);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
-
- // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
- if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
- LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
-
- if (r==0) {
- for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
- }
-
- //Temporary hack
- no_iteration_ldpc = dlsch->max_ldpc_iterations;
- ret = no_iteration_ldpc;
- } else {
- LOG_D(PHY,"CRC NOT OK\n\033[0m");
- }
-
- nb_total_decod++;
-
- if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
- nb_error_decod++;
- }
-
- for (int m=0; m < Kr>>3; m ++) {
- harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
- }
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- for (int k=0; k>3; k++)
- LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
- LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
- }
-
- stop_meas(dlsch_turbo_decoding_stats);
- }
-
- if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
- LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
- err_flag = 1;
- }
- }
-
- if (err_flag == 1) {
- LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
- harq_process->ack = 0;
- harq_process->errors[harq_process->round]++;
-
- if (harq_process->round >= dlsch->Mlimit) {
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- phy_vars_ue->dl_stats[4]++;
- }
-
- if(is_crnti) {
- LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
- phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
- }
-
- return((1 + dlsch->max_ldpc_iterations));
- } else {
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
- phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- harq_process->ack = 1;
-
- //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
- // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
-
- if(is_crnti) {
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
- }
-
- //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
- }
-
- // Reassembly of Transport block here
- offset = 0;
- Kr = harq_process->K;
- Kr_bytes = Kr>>3;
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN);
-
- for (r=0; rC; r++) {
- memcpy(harq_process->b+offset,
- harq_process->c[r],
- Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- LOG_D(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
- LOG_D(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
- (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
- LOG_D(PHY,"b[0] = %p,c[%d] = %p\n",
- (void *)(uint64_t)(harq_process->b[offset]),
- harq_process->F>>3,
- (void *)(uint64_t)(harq_process->c[r]) );
-
- if (frame%100 == 0) {
- LOG_D (PHY, "Printing 60 first payload bytes at frame: %d ", frame);
-
- for (int i = 0; i <60 ; i++) { //Kr_bytes
- LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
- }
- }
- }
+ //////////////////////////////////////////////////////////////////////////////////////////
+ }
+ for (r=0; rlast_iteration_cnt = ret;
+ ret = dlsch->last_iteration_cnt;
return(ret);
}
-
-
-uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
- UE_nr_rxtx_proc_t *proc,
- int eNB_id,
- short *dlsch_llr,
- NR_DL_FRAME_PARMS *frame_parms,
- NR_UE_DLSCH_t *dlsch,
- NR_DL_UE_HARQ_t *harq_process,
- uint32_t frame,
- uint16_t nb_symb_sch,
- uint8_t nr_slot_rx,
- uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag) {
-
- time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
- time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
- time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
- uint32_t A,E;
- uint32_t G;
- uint32_t ret,offset;
- uint32_t r,r_offset=0,Kr=8424,Kr_bytes,err_flag=0,K_bits_F;
- uint8_t crc_type;
- //UE_rxtx_proc_t *proc = &phy_vars_ue->proc;
- int32_t no_iteration_ldpc,length_dec;
- /*uint8_t C;
- uint8_t Qm;
- uint8_t r_thread;
- uint32_t Er, Gp,GpmodC;*/
- t_nrLDPC_dec_params decParams;
- t_nrLDPC_dec_params *p_decParams = &decParams;
- t_nrLDPC_time_stats procTime;
- t_nrLDPC_time_stats *p_procTime =&procTime ;
- int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
-
- if (!harq_process) {
- LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
- return(dlsch->max_ldpc_iterations);
- }
-
- t_nrLDPC_procBuf *p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
- uint8_t Nl=4;
- int16_t z [68*384];
- int8_t l [68*384];
- uint8_t kc;
- uint8_t Ilbrm = 1;
- uint32_t Tbslbrm = 950984;
- uint16_t nb_rb = 30;
- double Coderate = 0.0;
- uint8_t dmrs_type = harq_process->dmrsConfigType;
- uint8_t nb_re_dmrs;
-
- if (dmrs_type == NFAPI_NR_DMRS_TYPE1)
- nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups;
- else
- nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
-
- uint16_t length_dmrs = get_num_dmrs(harq_process->dlDmrsSymbPos);
- uint32_t i,j;
- __m128i *pv = (__m128i *)&z;
- __m128i *pl = (__m128i *)&l;
- notifiedFIFO_t nf;
- initNotifiedFIFO(&nf);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
-
- if (!dlsch_llr) {
- LOG_E(PHY,"dlsch_decoding.c: NULL dlsch_llr pointer\n");
- return(dlsch->max_ldpc_iterations);
- }
-
- if (!frame_parms) {
- LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n");
- return(dlsch->max_ldpc_iterations);
- }
-
- /* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
- printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
- return(dlsch->max_ldpc_iterations);
- }
-
- if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
- LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
- phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
- }*/
- /*
- if (nb_rb > frame_parms->N_RB_DL) {
- printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
- return(max_ldpc_iterations);
- }*/
- /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
- if (harq_pid >= 8) {
- printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
- return(max_ldpc_iterations);
- }
- */
- nb_rb = harq_process->nb_rb;
- harq_process->trials[harq_process->round]++;
- // HARQ stats
- phy_vars_ue->dl_stats[harq_process->round]++;
- uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
- harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
- A = harq_process->TBS;
- ret = dlsch->max_ldpc_iterations + 1;
- dlsch->last_iteration_cnt = ret;
- harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
- G = harq_process->G;
- LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs,
- harq_process->Nl, nb_symb_sch,nb_rb);
- proc->decoder_main_available = 1;
- proc->decoder_thread_available = 0;
- proc->decoder_thread_available1 = 0;
-
- if ((harq_process->R)<1024)
- Coderate = (float) (harq_process->R) /(float) 1024;
- else
- Coderate = (float) (harq_process->R) /(float) 2048;
-
- if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
- p_decParams->BG = 2;
- kc = 52;
-
- if (Coderate < 0.3333) {
- p_decParams->R = 15;
- } else if (Coderate <0.6667) {
- p_decParams->R = 13;
- } else {
- p_decParams->R = 23;
- }
- } else {
- p_decParams->BG = 1;
- kc = 68;
-
- if (Coderate < 0.6667) {
- p_decParams->R = 13;
- } else if (Coderate <0.8889) {
- p_decParams->R = 23;
- } else {
- p_decParams->R = 89;
- }
- }
-
- if (harq_process->first_rx == 1) {
- // This is a new packet, so compute quantities regarding segmentation
- if (A > NR_MAX_PDSCH_TBS)
- harq_process->B = A+24;
- else
- harq_process->B = A+16;
-
- nr_segmentation(NULL,
- NULL,
- harq_process->B,
- &harq_process->C,
- &harq_process->K,
- &harq_process->Z,
- &harq_process->F,
- p_decParams->BG);
- }
-
- p_decParams->Z = harq_process->Z;
- p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
- p_decParams->outMode= 0;
- err_flag = 0;
- r_offset = 0;
- uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
-
- if (nb_rb != 273) {
- a_segments = a_segments*nb_rb;
- a_segments = a_segments/273 +1;
- }
-
- if (harq_process->C > a_segments) {
- LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
- return((1+dlsch->max_ldpc_iterations));
- }
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- LOG_D(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
-
- notifiedFIFO_elt_t *res_dl;
- opp_enabled=1;
- if (harq_process->C>1) {
- for (int nb_seg =1 ; nb_segC; nb_seg++) {
- if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
- pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
- }
-
- AssertFatal((msgToPush_dl=pullNotifiedFIFO_nothreadSafe(&freeBlocks_dl)) != NULL,"chained list failure");
- nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush_dl);
- curMsg->UE=phy_vars_ue;
- nbDlProcessing++;
- memset(&curMsg->proc, 0, sizeof(curMsg->proc));
- curMsg->proc.frame_rx = proc->frame_rx;
- curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
- curMsg->proc.thread_id = proc->thread_id;
- curMsg->proc.num_seg = nb_seg;
- curMsg->proc.eNB_id= eNB_id;
- curMsg->proc.harq_pid=harq_pid;
- curMsg->proc.llr8_flag = llr8_flag;
- msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
- pushTpool(&pool_dl, msgToPush_dl);
- /*Qm= harq_process->Qm;
- Nl=harq_process->Nl;
- r_thread = harq_process->C/2-1;
- C= harq_process->C;
-
- Gp = G/Nl/Qm;
- GpmodC = Gp%C;
-
-
- if (r_thread < (C-(GpmodC)))
- Er = Nl*Qm * (Gp/C);
- else
- Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
- printf("mthread Er %d\n", Er);
-
- printf("mthread instance_cnt_dlsch_td %d\n", proc->instance_cnt_dlsch_td);*/
- }
-
- //proc->decoder_main_available = 1;
- }
-
- r = 0;
-
- if (r==0) r_offset =0;
-
- Kr = harq_process->K;
- Kr_bytes = Kr>>3;
- K_bits_F = Kr-harq_process->F;
- E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
- /*
- printf("Subblock deinterleaving, dlsch_llr %p, w %p\n",
- dlsch_llr+r_offset,
- &harq_process->w[r]);
- */
- start_meas(dlsch_deinterleaving_stats);
- nr_deinterleaving_ldpc(E,
- harq_process->Qm,
- harq_process->w[r],
- dlsch_llr+r_offset);
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- for (int i =0; i<16; i++)
- LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
-
- stop_meas(dlsch_deinterleaving_stats);
- start_meas(dlsch_rate_unmatching_stats);
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
- harq_pid,r, G,
- Kr*3,
- harq_process->TBS,
- harq_process->Qm,
- harq_process->nb_rb,
- harq_process->Nl,
- harq_process->rvidx,
- harq_process->round);
-
- // for tbslbrm calculation according to 5.4.2.1 of 38.212
- if (harq_process->Nl < Nl)
- Nl = harq_process->Nl;
-
- Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
-
- if (nr_rate_matching_ldpc_rx(Ilbrm,
- Tbslbrm,
- p_decParams->BG,
- p_decParams->Z,
- harq_process->d[r],
- harq_process->w[r],
- harq_process->C,
- harq_process->rvidx,
- (harq_process->first_rx==1)?1:0,
- E,
- harq_process->F,
- Kr-harq_process->F-2*(p_decParams->Z))==-1) {
- stop_meas(dlsch_rate_unmatching_stats);
- LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
- return(dlsch->max_ldpc_iterations);
- } else {
- stop_meas(dlsch_rate_unmatching_stats);
- }
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- for (int i =0; i<16; i++)
- LOG_I(PHY,"rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset);
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- if (r==0) {
- LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0);
- LOG_M("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
- }
-
- LOG_D(PHY,"decoder input(segment %u) :",r);
-
- for (int i=0; i<(3*8*Kr_bytes); i++)
- LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
-
- LOG_D(PHY,"\n");
- }
-
- memset(harq_process->c[r],0,Kr_bytes);
-
- if (harq_process->C == 1) {
- if (A > NR_MAX_PDSCH_TBS)
- crc_type = CRC24_A;
- else
- crc_type = CRC16;
-
- length_dec = harq_process->B;
- } else {
- crc_type = CRC24_B;
- length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
- }
-
- //#ifndef __AVX2__
-
- if (err_flag == 0) {
- /*
- LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
- Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
- harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
- */
- start_meas(dlsch_turbo_decoding_stats);
- LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
- /*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
- inv_d[cnt] = (1)*harq_process->d[r][cnt];
- }*/
- //set first 2*Z_c bits to zeros
- memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
- //set Filler bits
- memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
- //Move coded bits before filler bits
- memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
- //skip filler bits
- memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-
- //Saturate coded bits before decoding into 8 bits values
- for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
- pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
- }
- p_decParams->block_length=length_dec;
- nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
- no_iteration_ldpc = nrLDPC_decoder(p_decParams,
- (int8_t *)&pl[0],
- llrProcBuf,
- p_nrLDPC_procBuf,
- p_procTime);
- nb_total_decod++;
-
- if (no_iteration_ldpc > 10) {
- nb_error_decod++;
- ret = 1+dlsch->max_ldpc_iterations;
- } else {
- ret=2;
- }
-
- if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
- LOG_D(PHY,"Segment %u CRC OK\n",r);
- ret = 2;
- } else {
- ret = 1+dlsch->max_ldpc_iterations;
- }
-
- if (!nb_total_decod%10000) {
- printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);
- fflush(stdout);
- }
-
- for (int m=0; m < Kr>>3; m ++) {
- harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
- }
-
- /*for (int u=0; u < Kr>>3; u ++)
- {
- ullrProcBuf[u]= (uint8_t) llrProcBuf[u];
- }
-
-
- printf("output unsigned ullrProcBuf \n");
-
- for (int j=0; j < Kr>>3; j ++)
- {
- printf(" %d \n", ullrProcBuf[j]);
- }
- printf(" \n");*/
- //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
-
- //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- for (int k=0; k<32; k++)
- LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
-
- stop_meas(dlsch_turbo_decoding_stats);
- }
-
-
- if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
- LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
- err_flag = 1;
- }
-
- //} //loop r
-
- if (err_flag == 1) {
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
- harq_process->ack = 0;
- harq_process->errors[harq_process->round]++;
- harq_process->round++;
-
- if (harq_process->round >= dlsch->Mlimit) {
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- }
-
- if(is_crnti) {
- LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
- phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
- }
-
- return((1+dlsch->max_ldpc_iterations));
- } else {
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
- phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
-
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- harq_process->ack = 1;
- //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
- // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
-
- if(is_crnti) {
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
- }
-
- //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
- }
-
- // Reassembly of Transport block here
- offset = 0;
- /*
- printf("harq_pid %d\n",harq_pid);
- printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
- printf("C %d\n",harq_process->C);
- */
- //uint32_t wait = 0;
- /* while((proc->decoder_thread_available == 0) )
- {
- usleep(1);
- }
- proc->decoder_thread_available == 0;*/
- /*notifiedFIFO_elt_t *res1=tryPullTpool(&nf, Tpool);
- if (!res1) {
- printf("mthread trypull null\n");
- usleep(1);
- wait++;
- }*/
- //usleep(50);
- proc->decoder_main_available = 0;
- Kr = harq_process->K; //to check if same K in all segments
- Kr_bytes = Kr>>3;
-
- for (r=0; rC; r++) {
- memcpy(harq_process->b+offset,
- harq_process->c[r],
- Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
- offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
- LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
- (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
- LOG_I(PHY,"b[0] = %p,c[%d] = %p\n",
- (void *)(uint64_t)(harq_process->b[offset]),
- harq_process->F>>3,
- (void *)(uint64_t)(harq_process->c[r]));
- }
- }
-
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
- dlsch->last_iteration_cnt = ret;
- //proc->decoder_thread_available = 0;
- //proc->decoder_main_available = 0;
- return(ret);
-}
-
-
-void nr_dlsch_decoding_process(void *arg) {
- nr_rxtx_thread_data_t *rxtxD= (nr_rxtx_thread_data_t *)arg;
- UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
- PHY_VARS_NR_UE *phy_vars_ue = rxtxD->UE;
- int llr8_flag1;
- int32_t no_iteration_ldpc,length_dec;
- t_nrLDPC_dec_params decParams;
- t_nrLDPC_dec_params *p_decParams = &decParams;
- t_nrLDPC_time_stats procTime;
- t_nrLDPC_time_stats *p_procTime =&procTime ;
- int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
- t_nrLDPC_procBuf *p_nrLDPC_procBuf;
- int16_t z [68*384];
- int8_t l [68*384];
- //__m128i l;
- //int16_t inv_d [68*384];
- //int16_t *p_invd =&inv_d;
- uint8_t kc;
- uint8_t Ilbrm = 1;
- uint32_t Tbslbrm = 950984;
- uint16_t nb_rb = 30; //to update
- double Coderate = 0.0;
- uint16_t nb_symb_sch = 12;
- uint8_t nb_re_dmrs = 6;
- uint16_t length_dmrs = 1;
- uint32_t i,j;
- __m128i *pv = (__m128i *)&z;
- __m128i *pl = (__m128i *)&l;
- proc->instance_cnt_dlsch_td=-1;
- //proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
- proc->decoder_thread_available = 1;
- time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
- time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
- time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
-
- uint32_t A,E;
- uint32_t G;
- uint32_t ret;
- uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F;
- uint8_t crc_type;
- uint8_t C,Cprime;
- uint8_t Qm;
- uint8_t Nl;
- //uint32_t Er;
- int eNB_id = proc->eNB_id;
- int harq_pid = proc->harq_pid;
- llr8_flag1 = proc->llr8_flag;
- int frame = proc->frame_rx;
- r = proc->num_seg;
- NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
- NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid];
- short *dlsch_llr = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
- p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
- nb_symb_sch = harq_process->nb_symbols;
- LOG_D(PHY,"dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
- nb_rb = harq_process->nb_rb;
- harq_process->trials[harq_process->round]++;
- uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
- harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
- A = harq_process->TBS; //2072 for QPSK 1/3
- ret = dlsch->max_ldpc_iterations;
- harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
- G = harq_process->G;
-
- LOG_D(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d, Coderate %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb,harq_process->R);
-
- if ((harq_process->R)<1024)
- Coderate = (float) (harq_process->R) /(float) 1024;
- else
- Coderate = (float) (harq_process->R) /(float) 2048;
-
- if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
- p_decParams->BG = 2;
- kc = 52;
-
- if (Coderate < 0.3333) {
- p_decParams->R = 15;
- } else if (Coderate <0.6667) {
- p_decParams->R = 13;
- } else {
- p_decParams->R = 23;
- }
- } else {
- p_decParams->BG = 1;
- kc = 68;
-
- if (Coderate < 0.6667) {
- p_decParams->R = 13;
- } else if (Coderate <0.8889) {
- p_decParams->R = 23;
- } else {
- p_decParams->R = 89;
- }
- }
-
- if (harq_process->first_rx == 1) {
- // This is a new packet, so compute quantities regarding segmentation
- if (A > NR_MAX_PDSCH_TBS)
- harq_process->B = A+24;
- else
- harq_process->B = A+16;
-
- nr_segmentation(NULL,
- NULL,
- harq_process->B,
- &harq_process->C,
- &harq_process->K,
- &harq_process->Z,
- &harq_process->F,
- p_decParams->BG);
- p_decParams->Z = harq_process->Z;
- }
- LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
- p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
- p_decParams->outMode= 0;
- err_flag = 0;
- opp_enabled=1;
- Qm= harq_process->Qm;
- Nl=harq_process->Nl;
- //r_thread = harq_process->C/2-1;
- C= harq_process->C;
- Cprime = C; //assume CBGTI not present
-
- if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
- r_offset = Nl*Qm*(G/(Nl*Qm*Cprime));
- else
- r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
-
- //for (r=(harq_process->C/2); rC; r++) {
- // r=1; //(harq_process->C/2);
- r_offset = r*r_offset;
- Kr = harq_process->K;
- Kr_bytes = Kr>>3;
- K_bits_F = Kr-harq_process->F;
- E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
- start_meas(dlsch_deinterleaving_stats);
- nr_deinterleaving_ldpc(E,
- harq_process->Qm,
- harq_process->w[r],
- dlsch_llr+r_offset);
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- for (int i =0; i<16; i++)
- LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
-
- stop_meas(dlsch_deinterleaving_stats);
- start_meas(dlsch_rate_unmatching_stats);
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
- harq_pid,r, G,
- Kr*3,
- harq_process->TBS,
- harq_process->Qm,
- harq_process->nb_rb,
- harq_process->Nl,
- harq_process->rvidx,
- harq_process->round);
-
- if (Nl<4)
- Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl);
- else
- Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
-
- if (nr_rate_matching_ldpc_rx(Ilbrm,
- Tbslbrm,
- p_decParams->BG,
- p_decParams->Z,
- harq_process->d[r],
- harq_process->w[r],
- harq_process->C,
- harq_process->rvidx,
- (harq_process->first_rx==1)?1:0,
- E,
- harq_process->F,
- Kr-harq_process->F-2*(p_decParams->Z))==-1) {
- stop_meas(dlsch_rate_unmatching_stats);
- LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
- //return(dlsch->max_ldpc_iterations);
- } else {
- stop_meas(dlsch_rate_unmatching_stats);
- }
-
- if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
- LOG_D(PHY,"decoder input(segment %u) :",r);
-
- for (int i=0; i<(3*8*Kr_bytes)+12; i++)
- LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
-
- LOG_D(PHY,"\n");
- }
-
- memset(harq_process->c[r],0,Kr_bytes);
-
- if (harq_process->C == 1) {
- if (A > NR_MAX_PDSCH_TBS)
- crc_type = CRC24_A;
- else
- crc_type = CRC16;
-
- length_dec = harq_process->B;
- } else {
- crc_type = CRC24_B;
- length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
- }
-
- if (err_flag == 0) {
- /*
- LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
- Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
- harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
- */
- if (llr8_flag1) {
- AssertFatal (Kr >= 256, "LDPC algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
- Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
- }
-
- start_meas(dlsch_turbo_decoding_stats);
- // LOG_D(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
- /*
- for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
- inv_d[cnt] = (1)*harq_process->d[r][cnt];
- }
- */
- //set first 2*Z_c bits to zeros
- memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
- //set Filler bits
- memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
- //Move coded bits before filler bits
- memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
- //skip filler bits
- memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-
- //Saturate coded bits before decoding into 8 bits values
- for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
- pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
- }
- p_decParams->block_length=length_dec;
- nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
- no_iteration_ldpc = nrLDPC_decoder(p_decParams,
- (int8_t *)&pl[0],
- llrProcBuf,
- p_nrLDPC_procBuf,
- p_procTime);
-
- // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
- if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
- LOG_D(PHY,"Segment %u CRC OK\n",r);
- ret = 2;
- } else {
- LOG_D(PHY,"Segment %u CRC NOK\n",r);
- ret = 1+dlsch->max_ldpc_iterations;
- }
-
- if (no_iteration_ldpc > 10)
- LOG_D(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc);
-
- for (int m=0; m < Kr>>3; m ++) {
- harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
- }
-
- if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
- for (int k=0; k<2; k++)
- LOG_D(PHY,"segment 1 output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
- stop_meas(dlsch_turbo_decoding_stats);
- }
-
- if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
- // LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
- err_flag = 1;
- }
-
- //}
- proc->decoder_thread_available = 1;
- //proc->decoder_main_available = 0;
-}
-
-void *dlsch_thread(void *arg) {
- //this thread should be over the processing thread to keep in real time
- notifiedFIFO_t nf;
- initNotifiedFIFO(&nf);
- notifiedFIFO_elt_t *res_dl;
- initNotifiedFIFO_nothreadSafe(&freeBlocks_dl);
-
- for (int i=0; i= tpool_nbthreads(pool_dl)) {
- if ( (res=tryPullTpool(&nf, &pool_dl)) != NULL ) {
- //nbDlProcessing--;
- pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res);
- }
-
- usleep(200);
- }
-
- res_dl=pullTpool(&nf, &pool_dl);
- nbDlProcessing--;
- pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
- //msgToPush->key=0;
- //pushTpool(Tpool, msgToPush);
- } // while !oai_exit
-
- return NULL;
-}
-
-
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 046ca927a6..0ab17c11e6 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -1087,22 +1087,6 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
NR_DL_FRAME_PARMS *frame_parms,
uint8_t Nl);
-
-
-uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
- UE_nr_rxtx_proc_t *proc,
- int eNB_id,
- short *dlsch_llr,
- NR_DL_FRAME_PARMS *frame_parms,
- NR_UE_DLSCH_t *dlsch,
- NR_DL_UE_HARQ_t *harq_process,
- uint32_t frame,
- uint16_t nb_symb_sch,
- uint8_t nr_slot_rx,
- uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag);
-
void *nr_dlsch_decoding_2thread0(void *arg);
void *nr_dlsch_decoding_2thread1(void *arg);
@@ -1750,8 +1734,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
-
-void *dlsch_thread(void *arg);
/**@}*/
#endif
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 027e73ea4a..69978f5548 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -1078,5 +1078,27 @@ typedef struct nr_rxtx_thread_data_s {
notifiedFIFO_t txFifo;
} nr_rxtx_thread_data_t;
+typedef struct LDPCDecode_ue_s {
+ PHY_VARS_NR_UE *phy_vars_ue;
+ NR_DL_UE_HARQ_t *harq_process;
+ t_nrLDPC_dec_params decoderParms;
+ NR_UE_DLSCH_t *dlsch;
+ short* dlsch_llr;
+ int dlsch_id;
+ int harq_pid;
+ int rv_index;
+ int A;
+ int E;
+ int Kc;
+ int Qm;
+ int Kr_bytes;
+ int nbSegments;
+ int segment_r;
+ int r_offset;
+ int offset;
+ int Tbslbrm;
+ int decodeIterations;
+} ldpcDecode_ue_t;
+
#include "SIMULATION/ETH_TRANSPORT/defs.h"
#endif
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index f6e4d90bee..7cf22db1a9 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -105,7 +105,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0->active = 1;
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];
if (dlsch0_harq){
@@ -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;
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) {
- // dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the
- // following flag to skip PDSCH procedures in that case.
+ // dlsch0_harq->status not ACTIVE due to false retransmission
+ // Reset the following flag to skip PDSCH procedures in that case and retrasmit harq status
dlsch0->active = 0;
+ update_harq_status(module_id,dlsch0->current_harq_pid,dlsch0_harq->ack);
}
/* PTRS */
dlsch0_harq->PTRSFreqDensity = dlsch_config_pdu->PTRSFreqDensity;
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
index f00ce14b56..0cd882a9b5 100755
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
@@ -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)*/
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
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index 7bc1f3053b..5b65131934 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -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) {
-
if (rnti_type == _SI_RNTI_ ||
rnti_type == _P_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
break;
case 1:
dl_harq->round = 2;
+ dl_harq->status = ACTIVE;
dl_harq->first_rx = 0;
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);
- dl_harq->status = ACTIVE;
dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi;
}
- else if (dl_harq->ack)
+ else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE;
break;
case 2:
dl_harq->round = 1;
+ dl_harq->status = ACTIVE;
dl_harq->first_rx = 0;
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);
- dl_harq->status = ACTIVE;
dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi;
}
- else if (dl_harq->ack)
+ else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE;
break;
case 3:
dl_harq->round = 3;
+ dl_harq->status = ACTIVE;
dl_harq->first_rx = 0;
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);
- dl_harq->status = ACTIVE;
dl_harq->first_rx = 1;
dl_harq->DCINdi = ndi;
}
- else if (dl_harq->ack)
+ else if (dl_harq->ack == 1)
dl_harq->status = SCH_IDLE;
break;
default:
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index e1b87185bd..f094a2948c 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -981,37 +981,23 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+ ret = nr_dlsch_decoding(ue,
+ proc,
+ gNB_id,
+ pdsch_vars->llr[0],
+ &ue->frame_parms,
+ dlsch0,
+ dlsch0->harq_processes[harq_pid],
+ frame_rx,
+ nb_symb_sch,
+ nr_slot_rx,
+ harq_pid,
+ pdsch==PDSCH?1:0,
+ dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
if( dlsch_parallel) {
- ret = nr_dlsch_decoding_mthread(ue,
- proc,
- gNB_id,
- pdsch_vars->llr[0],
- &ue->frame_parms,
- dlsch0,
- dlsch0->harq_processes[harq_pid],
- frame_rx,
- nb_symb_sch,
- nr_slot_rx,
- harq_pid,
- pdsch==PDSCH?1:0,
- dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
-
LOG_T(PHY,"dlsch decoding is parallelized, ret = %d\n", ret);
}
else {
- ret = nr_dlsch_decoding(ue,
- proc,
- gNB_id,
- pdsch_vars->llr[0],
- &ue->frame_parms,
- dlsch0,
- dlsch0->harq_processes[harq_pid],
- frame_rx,
- nb_symb_sch,
- nr_slot_rx,
- harq_pid,
- pdsch==PDSCH?1:0,
- dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"Sequential dlsch decoding , ret = %d\n", ret);
}
@@ -1083,36 +1069,24 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+ ret1 = nr_dlsch_decoding(ue,
+ proc,
+ gNB_id,
+ pdsch_vars->llr[1],
+ &ue->frame_parms,
+ dlsch1,
+ dlsch1->harq_processes[harq_pid],
+ frame_rx,
+ nb_symb_sch,
+ nr_slot_rx,
+ harq_pid,
+ pdsch==PDSCH?1:0,//proc->decoder_switch,
+ dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
if(dlsch_parallel) {
- ret1 = nr_dlsch_decoding_mthread(ue,
- proc,
- gNB_id,
- pdsch_vars->llr[1],
- &ue->frame_parms,
- dlsch1,
- dlsch1->harq_processes[harq_pid],
- frame_rx,
- nb_symb_sch,
- nr_slot_rx,
- harq_pid,
- pdsch==PDSCH?1:0,
- dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"CW dlsch decoding is parallelized, ret1 = %d\n", ret1);
}
else {
- ret1 = nr_dlsch_decoding(ue,
- proc,
- gNB_id,
- pdsch_vars->llr[1],
- &ue->frame_parms,
- dlsch1,
- dlsch1->harq_processes[harq_pid],
- frame_rx,
- nb_symb_sch,
- nr_slot_rx,
- harq_pid,
- pdsch==PDSCH?1:0,//proc->decoder_switch,
- dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+
LOG_T(PHY,"CWW sequential dlsch decoding, ret1 = %d\n", ret1);
}
@@ -1887,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);
}
-
// do procedures for C-RNTI
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);
start_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index a0e0183fd1..1d9584b30b 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -109,6 +109,7 @@ int main(int argc, char **argv)
int ret;
//int run_initial_sync=0;
int loglvl = OAILOG_WARNING;
+ uint8_t dlsch_threads = 0;
float target_error_rate = 0.01;
uint64_t SSB_positions=0x01;
uint16_t nb_symb_sch = 12;
@@ -138,9 +139,9 @@ int main(int argc, char **argv)
break;*/
- /*case 'd':
- frame_type = 1;
- break;*/
+ case 'd':
+ dlsch_threads = atoi(optarg);
+ break;
case 'g':
switch ((char) *optarg) {
@@ -320,6 +321,7 @@ int main(int argc, char **argv)
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
//printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
+ printf("-d number of dlsch threads, 0: no dlsch parallelization\n");
exit(-1);
break;
}
@@ -331,6 +333,7 @@ int main(int argc, char **argv)
if (snr1set == 0)
snr1 = snr0 + 10;
+ init_dlsch_tpool(dlsch_threads);
if (ouput_vcd)
vcd_signal_dumper_init("/tmp/openair_dump_nr_dlschsim.vcd");
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 28e6379adf..6596016f6a 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -688,7 +688,7 @@ int main(int argc, char **argv)
if (snr1set==0)
snr1 = snr0+10;
-
+ init_dlsch_tpool(dlsch_threads);
RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
@@ -768,7 +768,7 @@ int main(int argc, char **argv)
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 */
fix_scd(scd);
@@ -980,11 +980,7 @@ int main(int argc, char **argv)
reset_meas(&msgDataTx->phy_proc_tx);
gNB->phy_proc_tx_0 = &msgDataTx->phy_proc_tx;
pushTpool(gNB->threadPool,msgL1Tx);
- if (dlsch_threads ) {
- init_dlsch_tpool(dlsch_threads);
- pthread_t dlsch0_threads;
- threadCreate(&dlsch0_threads, dlsch_thread, (void *)UE, "DLthread", -1, OAI_PRIORITY_RT_MAX-1);
- }
+
for (SNR = snr0; SNR < snr1; SNR += .2) {
varArray_t *table_tx=initVarArray(1000,sizeof(double));
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 0aed6d9780..213924e5fd 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -662,14 +662,19 @@ int main(int argc, char **argv)
if (uci_pdu.sr->sr_indication == 0 || uci_pdu.sr->sr_confidence_level == 1)
sr_errors+=1;
}
+ // harq value 0 -> pass
+ // confidence value 0 -> good confidence
+ const int harq_value0 = uci_pdu.harq->harq_list[0].harq_value;
+ const int harq_value1 = uci_pdu.harq->harq_list[1].harq_value;
+ const int confidence_lvl = uci_pdu.harq->harq_confidence_level;
if(nr_bit>0){
if (nr_bit==1 && do_DTX == 0)
- ack_nack_errors+=(actual_payload^uci_pdu.harq->harq_list[0].harq_value);
+ ack_nack_errors+=(actual_payload^(!harq_value0));
else if (do_DTX == 0)
- ack_nack_errors+=(((actual_payload&1)^uci_pdu.harq->harq_list[0].harq_value)+((actual_payload>>1)^uci_pdu.harq->harq_list[1].harq_value));
- else if ((uci_pdu.harq->harq_confidence_level == 0 && uci_pdu.harq->harq_list[0].harq_value == 1) ||
- (uci_pdu.harq->harq_confidence_level == 0 && nr_bit == 2 && uci_pdu.harq->harq_list[1].harq_value==1))
- ack_nack_errors++;
+ ack_nack_errors+=(((actual_payload&1)^(!harq_value0))+((actual_payload>>1)^(!harq_value1)));
+ else if ((!confidence_lvl && !harq_value0) ||
+ (!confidence_lvl && nr_bit == 2 && !harq_value1))
+ ack_nack_errors++;
free(uci_pdu.harq->harq_list);
}
}
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 69316d6b88..a7075eb218 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -713,7 +713,7 @@ int main(int argc, char **argv)
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);
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index dffced1374..9851d14b91 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -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);
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;
+ 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);
NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index bf1d12825e..0c3d971569 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -149,7 +149,7 @@ typedef enum {
{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_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
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index a9632fb330..288716ed85 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -299,9 +299,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
frame_t frame,
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,
frame_t frame,
int slot,
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 0f0a9a6a4b..a5f6e4a7d1 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -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 =
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
- set_harq_status(mac,dci->pucch_resource_indicator,
- dci->harq_pid,
- dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
- feedback_ti,
- dci->dai[0].val,
- dci_ind->n_CCE,dci_ind->N_CCE,0,
- frame,slot);
+ AssertFatal(feedback_ti>=DURATION_RX_TO_TX,"PDSCH to HARQ feedback time (%d) cannot be less than DURATION_RX_TO_TX (%d)\n",
+ feedback_ti,DURATION_RX_TO_TX);
+
+ // set the harq status at MAC for feedback
+ set_harq_status(mac,dci->pucch_resource_indicator,
+ dci->harq_pid,
+ dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
+ 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;
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,
}
-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,
int slot,
uint16_t rnti,
@@ -2123,7 +2107,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
uint32_t V_temp = 0;
uint32_t V_temp2 = 0;
int O_ACK = 0;
- int o_ACK = 0;
+ uint8_t o_ACK = 0;
int O_bit_number_cw0 = 0;
int O_bit_number_cw1 = 0;
@@ -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);
+ LOG_D(MAC,"m %d bit number %d o_ACK %d\n",m,O_bit_number_cw0,o_ACK);
}
if (V_temp2 < V_temp) {
@@ -2169,8 +2154,11 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
return (0);
}
+ reverse_n_bits(&o_ACK,number_harq_feedback);
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);
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index c23d4bb073..911d051ed5 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -2153,7 +2153,8 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
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);
fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP);
pthread_mutex_lock(&ul_config->mutex_ul_config);
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index a99f08b641..a56206a1d2 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -520,12 +520,13 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[0];
RC.nrmac[Mod_idP]->sib1_tda = sib1_tda;
for (int n=0;nra[n].cfra = false;
- cc->ra[n].rnti = 0;
- cc->ra[n].preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES;
- cc->ra[n].preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t));
- for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++)
- cc->ra[n].preambles.preamble_list[i] = i;
+ cc->ra[n].cfra = false;
+ cc->ra[n].msg3_dcch_dtch = false;
+ cc->ra[n].rnti = 0;
+ cc->ra[n].preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES;
+ cc->ra[n].preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t));
+ for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++)
+ cc->ra[n].preambles.preamble_list[i] = i;
}
}
}
@@ -602,6 +603,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++)
ra->preambles.preamble_list[i] = i;
}
+ ra->msg3_dcch_dtch = false;
LOG_I(NR_MAC,"Added new RA process for UE RNTI %04x with initial CellGroup\n", rnti);
} else { // CellGroup has been updated
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon;
@@ -610,14 +612,27 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
UE_info->CellGroup[UE_id] = CellGroup;
LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti);
process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
+ const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
+ if (sched_ctrl->available_dl_harq.len == 0) {
+ // add all available DL HARQ processes for this UE in SA
+ create_dl_harq_list(sched_ctrl, pdsch);
+ }
+ else {
+ const int nrofHARQ = pdsch && pdsch->nrofHARQ_ProcessesForPDSCH ?
+ get_nrofHARQ_ProcessesForPDSCH(*pdsch->nrofHARQ_ProcessesForPDSCH) : 8;
+ AssertFatal(sched_ctrl->available_dl_harq.len==nrofHARQ,
+ "Reconfiguration of available harq processes not yet supported\n");
+ }
// update coreset/searchspace
void *bwpd = NULL;
NR_BWP_t *genericParameters = NULL;
target_ss = NR_SearchSpace__searchSpaceType_PR_common;
- if ((UE_info->UE_sched_ctrl[UE_id].active_bwp)) {
+ if ((sched_ctrl->active_bwp)) {
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- bwpd = (void*)UE_info->UE_sched_ctrl[UE_id].active_bwp->bwp_Dedicated;
- genericParameters = &UE_info->UE_sched_ctrl[UE_id].active_bwp->bwp_Common->genericParameters;
+ bwpd = (void*)sched_ctrl->active_bwp->bwp_Dedicated;
+ genericParameters = &sched_ctrl->active_bwp->bwp_Common->genericParameters;
}
else if (CellGroup->spCellConfig &&
CellGroup->spCellConfig->spCellConfigDedicated &&
@@ -626,15 +641,15 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
bwpd = (void*)CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
}
- UE_info->UE_sched_ctrl[UE_id].search_space = get_searchspace(scc, bwpd, target_ss);
- UE_info->UE_sched_ctrl[UE_id].coreset = get_coreset(Mod_idP, scc, bwpd, UE_info->UE_sched_ctrl[UE_id].search_space, target_ss);
+ sched_ctrl->search_space = get_searchspace(scc, bwpd, target_ss);
+ sched_ctrl->coreset = get_coreset(Mod_idP, scc, bwpd, sched_ctrl->search_space, target_ss);
UE_info->UE_sched_ctrl[UE_id].sched_pdcch = set_pdcch_structure(RC.nrmac[Mod_idP],
- UE_info->UE_sched_ctrl[UE_id].search_space,
- UE_info->UE_sched_ctrl[UE_id].coreset,
+ sched_ctrl->search_space,
+ sched_ctrl->coreset,
scc,
genericParameters,
NULL);
- UE_info->UE_sched_ctrl[UE_id].maxL = 2;
+ sched_ctrl->maxL = 2;
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 1fd6417214..924fbf35b6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -367,7 +367,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
schedule_nr_prach(module_idP, f, s);
}
- // This schedule SR
+ // This schedule SR
nr_sr_reporting(module_idP, frame, slot);
// Schedule CSI-RS transmission
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 516901b351..49577c664b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -819,7 +819,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
coreset,
0);
if (CCEIndex < 0) {
- LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti);
+ LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI 0x%04x!\n", __func__, ra->rnti);
return;
}
@@ -1216,7 +1216,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
0);
if (CCEIndex < 0) {
- LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti);
+ LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI 0x%04x!\n", __func__, ra->rnti);
return;
}
@@ -1247,7 +1247,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dl_req->nPDUs+=1;
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
- LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
+ LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%04x, state %d, CoreSetType %d\n",
module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType);
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
@@ -1442,6 +1442,12 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg4\n");
+ rnti_t tc_rnti = ra->rnti;
+ // If UE is known by the network, C-RNTI to be used instead of TC-RNTI
+ if(ra->msg3_dcch_dtch) {
+ ra->rnti = ra->crnti;
+ }
+
int UE_id = find_nr_UE_id(module_idP, ra->rnti);
NR_UE_info_t *UE_info = &nr_mac->UE_info;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
@@ -1475,6 +1481,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
harq->is_waiting = true;
ra->harq_pid = current_harq_pid;
+ // Remove UE associated to TC-RNTI
+ if(harq->round==0 && ra->msg3_dcch_dtch) {
+ mac_remove_nr_ue(module_idP, tc_rnti);
+ }
+
// get CCEindex, needed also for PUCCH and then later for PDCCH
uint8_t aggregation_level;
uint8_t nr_of_candidates;
@@ -1494,7 +1505,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
0);
if (CCEIndex < 0) {
- LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti);
+ LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI 0x%04x!\n", __func__, ra->rnti);
return;
}
@@ -1518,15 +1529,21 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
uint8_t *buf = (uint8_t *) harq->tb;
// Bytes to be transmitted
if (harq->round == 0) {
- uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
- LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
- uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
- ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
- LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length);
+ if (ra->msg3_dcch_dtch) {
+ // If the UE used MSG3 to transfer a DCCH or DTCH message, then contention resolution is successful if the UE receives a PDCCH transmission which has its CRC bits scrambled by the C-RNTI
+ // Just send padding LCID
+ ra->mac_pdu_length = 0;
+ } else {
+ uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
+ LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
+ uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
+ ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
+ LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length);
+ }
}
// Calculate number of symbols
@@ -1791,8 +1808,23 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
LOG_D(NR_MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity);
LOG_D(NR_MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci);
- ra->state = WAIT_Msg4_ACK;
- LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
+ if(ra->msg3_dcch_dtch) {
+ // If the UE used MSG3 to transfer a DCCH or DTCH message, then contention resolution is successful upon transmission of PDCCH
+ LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CBRA procedure succeeded!\n", UE_id, ra->rnti);
+ nr_clear_ra_proc(module_idP, CC_id, frameP, ra);
+ UE_info->active[UE_id] = true;
+ UE_info->Msg4_ACKed[UE_id] = true;
+
+ remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
+ harq->feedback_slot = -1;
+ harq->is_waiting = false;
+ add_tail_nr_list(&sched_ctrl->available_dl_harq, current_harq_pid);
+ harq->round = 0;
+ harq->ndi ^= 1;
+ } else {
+ ra->state = WAIT_Msg4_ACK;
+ LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
+ }
}
}
@@ -1806,23 +1838,22 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
- LOG_D(NR_MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
+ LOG_D(NR_MAC, "ue %d, rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
if (harq->is_waiting == 0) {
if (harq->round == 0) {
if (stats->dlsch_errors == 0) {
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
- nr_clear_ra_proc(module_id, CC_id, frame, ra);
UE_info->active[UE_id] = true;
UE_info->Msg4_ACKed[UE_id] = true;
- if(sched_ctrl->retrans_dl_harq.head>=0)
- remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
}
else {
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
- nr_mac_remove_ra_rnti(module_id, ra->rnti);
- nr_clear_ra_proc(module_id, CC_id, frame, ra);
- mac_remove_nr_ue(module_id, ra->rnti);
+ }
+
+ nr_clear_ra_proc(module_id, CC_id, frame, ra);
+ if(sched_ctrl->retrans_dl_harq.head >= 0) {
+ remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
}
}
else {
@@ -1840,6 +1871,8 @@ void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t
ra->timing_offset = 0;
ra->RRC_timer = 20;
ra->msg3_round = 0;
+ ra->msg3_dcch_dtch = false;
+ ra->crnti = 0;
if(ra->cfra == false) {
ra->rnti = 0;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 57403d9faa..1f5eb4af2b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -799,7 +799,7 @@ void pf_dl(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* 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) {
LOG_D(NR_MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
@@ -1263,6 +1263,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
"UE %d mismatch between scheduled TBS and buffered TB for HARQ PID %d\n",
UE_id,
current_harq_pid);
+
+ T(T_GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
+ T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->tb, TBS));
} else { /* initial transmission */
LOG_D(NR_MAC, "[%s] Initial HARQ transmission in %d.%d\n", __FUNCTION__, frame, slot);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index b691674b3e..2de5117229 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -360,7 +360,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
__func__,
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) {
LOG_D(MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 602d2ab555..a5ba558deb 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -2007,7 +2007,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
{
NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_idP]->common_channels[0].ServingCellConfigCommon;
NR_UE_info_t *UE_info = &RC.nrmac[mod_idP]->UE_info;
- LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti %x (num_UEs %d)\n",
+ LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti 0x%04x (num_UEs %d)\n",
mod_idP,
rntiP,
UE_info->num_UEs);
@@ -2053,8 +2053,9 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
if (bwpList) AssertFatal(bwpList->list.count == 1,
"downlinkBWP_ToAddModList has %d BWP!\n",
bwpList->list.count);
- const int bwp_id = 1;
- sched_ctrl->active_bwp = bwpList ? bwpList->list.array[bwp_id - 1] : NULL;
+
+ const int bwp_id = servingCellConfig ? *servingCellConfig->firstActiveDownlinkBWP_Id : 0;
+ sched_ctrl->active_bwp = bwpList && bwp_id > 0 ? bwpList->list.array[bwp_id - 1] : NULL;
NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
&sched_ctrl->active_bwp->bwp_Common->genericParameters:
&scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
@@ -2075,23 +2076,20 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
if (ubwpList) AssertFatal(ubwpList->list.count == 1,
"uplinkBWP_ToAddModList has %d BWP!\n",
ubwpList->list.count);
- sched_ctrl->active_ubwp = ubwpList ? ubwpList->list.array[bwp_id - 1] : NULL;
+ const int ul_bwp_id = servingCellConfig ? *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id : 0;
+ sched_ctrl->active_ubwp = ubwpList && ul_bwp_id > 0 ? ubwpList->list.array[ul_bwp_id - 1] : NULL;
/* get Number of HARQ processes for this UE */
if (servingCellConfig) AssertFatal(servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
"no pdsch-ServingCellConfig found for UE %d\n",
UE_id);
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
- const int nrofHARQ = pdsch ? (pdsch->nrofHARQ_ProcessesForPDSCH ?
- get_nrofHARQ_ProcessesForPDSCH(*pdsch->nrofHARQ_ProcessesForPDSCH) : 8) : 8;
- // add all available DL HARQ processes for this UE
- create_nr_list(&sched_ctrl->available_dl_harq, nrofHARQ);
- for (int harq = 0; harq < nrofHARQ; harq++)
- add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
- create_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ);
- create_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ);
-
+ // add DL HARQ processes for this UE only in NSA
+ // (SA still doesn't have information on nrofHARQ_ProcessesForPDSCH at this stage)
+ if (!get_softmodem_params()->sa)
+ create_dl_harq_list(sched_ctrl,pdsch);
// add all available UL HARQ processes for this UE
+ // nb of ul harq processes not configurable
create_nr_list(&sched_ctrl->available_ul_harq, 16);
for (int harq = 0; harq < 16; harq++)
add_tail_nr_list(&sched_ctrl->available_ul_harq, harq);
@@ -2111,6 +2109,19 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
return -1;
}
+
+void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
+ const NR_PDSCH_ServingCellConfig_t *pdsch) {
+ const int nrofHARQ = pdsch && pdsch->nrofHARQ_ProcessesForPDSCH ?
+ get_nrofHARQ_ProcessesForPDSCH(*pdsch->nrofHARQ_ProcessesForPDSCH) : 8;
+ // add all available DL HARQ processes for this UE
+ create_nr_list(&sched_ctrl->available_dl_harq, nrofHARQ);
+ for (int harq = 0; harq < nrofHARQ; harq++)
+ add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
+ create_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ);
+ create_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ);
+}
+
/* hack data to remove UE in the phy */
int rnti_to_remove[10];
volatile int rnti_to_remove_count;
@@ -2144,7 +2155,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
destroy_nr_list(&sched_ctrl->available_ul_harq);
destroy_nr_list(&sched_ctrl->feedback_ul_harq);
destroy_nr_list(&sched_ctrl->retrans_ul_harq);
- LOG_I(NR_MAC, "[gNB %d] Remove NR UE_id %d : rnti %x\n",
+ LOG_I(NR_MAC, "[gNB %d] Remove NR UE_id %d: rnti 0x%04x\n",
mod_id,
UE_id,
rnti);
@@ -2284,6 +2295,7 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
}
+
void nr_csirs_scheduling(int Mod_idP,
frame_t frame,
sub_frame_t slot,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 3a359552da..a94559769d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -1099,7 +1099,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
DevAssert(harq->is_waiting);
const int8_t pid = sched_ctrl->feedback_dl_harq.head;
remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
- handle_dl_harq(mod_id, UE_id, pid, harq_value == 1 && harq_confidence == 0);
+ 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);
if (harq_confidence == 1) UE_info->mac_stats[UE_id].pucch0_DTX++;
}
}
@@ -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_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_period = first_ul_slot_tdd%nr_slots_period;
+ const int first_ul_slot_period = tdd->nrofDownlinkSlots;
const int CC_id = 0;
NR_sched_pucch_t *csi_pucch;
@@ -1236,11 +1237,11 @@ int nr_acknack_scheduling(int mod_id,
&& !csi_pucch->simultaneous_harqcsi) {
nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
memset(csi_pucch, 0, sizeof(*csi_pucch));
- pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
- if(((s + 1)%nr_slots_period) == 0)
- pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame;
+ pucch->frame = pucch->ul_slot == n_slots_frame - 1 ? (pucch->frame + 1) % 1024 : pucch->frame;
+ if(((pucch->ul_slot + 1)%nr_slots_period) == 0)
+ pucch->ul_slot = (pucch->ul_slot + 1 + first_ul_slot_period) % n_slots_frame;
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,
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);
- 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);
/* there is a HARQ. Check whether we can use it for this ACKNACK */
@@ -1273,7 +1273,10 @@ int nr_acknack_scheduling(int mod_id,
// Find the right timing_indicator value.
int i = 0;
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;
++i;
}
@@ -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);
/* we need to find a new PUCCH occasion */
- /*Inizialization of timing information*/
- if (pucch->frame == 0 && pucch->ul_slot == 0) {
+ /*(Re)Inizialization of timing information*/
+ 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,
"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);
@@ -1314,13 +1319,16 @@ int nr_acknack_scheduling(int mod_id,
// Find the right timing_indicator value.
int ind_found = -1;
- // while we are within the feedback limits and it has not been
- while ((pucch->frame*n_slots_frame + pucch->ul_slot) <= max_absslot) {
+ // while we are within the feedback limits
+ while ((n_slots_frame + pucch->ul_slot - slot) % n_slots_frame <= max_fb_time) {
int i = 0;
while (i < 8) {
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);
- 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;
break;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 30f5ba1476..f303369c22 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -298,6 +298,17 @@ int nr_process_mac_pdu(module_id_t module_idP,
break;
case UL_SCH_LCID_C_RNTI:
+
+ for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+ NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i];
+ if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) {
+ ra->crnti = ((pduP[1]&0xFF)<<8)|(pduP[2]&0xFF);
+ ra->msg3_dcch_dtch = true;
+ LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x\n", ra->crnti);
+ break;
+ }
+ }
+
//38.321 section 6.1.3.2
//fixed length
mac_ce_len = 2;
@@ -365,10 +376,25 @@ int nr_process_mac_pdu(module_id_t module_idP,
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
mac_subheader_len = 2;
}
- if (UE_info->CellGroup[UE_id]) {
- LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, UE_info->rnti[UE_id]);
+
+ rnti_t crnti = UE_info->rnti[UE_id];
+ int UE_idx = UE_id;
+ for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+ NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i];
+ if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) {
+ uint8_t *next_subpduP = pduP + mac_subheader_len + mac_sdu_len;
+ if ((pduP[mac_subheader_len+mac_sdu_len] & 0x3F) == UL_SCH_LCID_C_RNTI) {
+ crnti = ((next_subpduP[1]&0xFF)<<8)|(next_subpduP[2]&0xFF);
+ UE_idx = find_nr_UE_id(module_idP, crnti);
+ break;
+ }
+ }
+ }
+
+ if (UE_info->CellGroup[UE_idx]) {
+ LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: 0x%04x \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, crnti);
mac_rlc_data_ind(module_idP,
- UE_info->rnti[UE_id],
+ crnti,
module_idP,
frameP,
ENB_FLAG_YES,
@@ -533,7 +559,7 @@ void handle_nr_ul_harq(const int CC_idP,
ra->rnti == crc_pdu->rnti)
return;
}
- LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUSCH\n", __func__, crc_pdu->rnti);
+ LOG_E(NR_MAC, "%s(): unknown RNTI 0x%04x in PUSCH\n", __func__, crc_pdu->rnti);
return;
}
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
@@ -541,7 +567,7 @@ void handle_nr_ul_harq(const int CC_idP,
int8_t harq_pid = sched_ctrl->feedback_ul_harq.head;
while (crc_pdu->harq_id != harq_pid || harq_pid < 0) {
LOG_W(NR_MAC,
- "Unexpected ULSCH HARQ PID %d (have %d) for RNTI %04x (ignore this warning for RA)\n",
+ "Unexpected ULSCH HARQ PID %d (have %d) for RNTI 0x%04x (ignore this warning for RA)\n",
crc_pdu->harq_id,
harq_pid,
crc_pdu->rnti);
@@ -752,13 +778,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP;
LOG_D(NR_MAC,
- "reset RA state information for RA-RNTI %04x/index %d\n",
+ "reset RA state information for RA-RNTI 0x%04x/index %d\n",
ra->rnti,
i);
LOG_I(NR_MAC,
- "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
- "adding UE MAC Context UE_id %d/RNTI %04x\n",
+ "[gNB %d][RAPROC] PUSCH with TC_RNTI 0x%04x received correctly, "
+ "adding UE MAC Context UE_id %d/RNTI 0x%04x\n",
gnb_mod_idP,
current_rnti,
UE_id,
@@ -796,7 +822,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
ra->state = Msg4;
ra->Msg4_frame = (frameP + 2) % 1024;
ra->Msg4_slot = 1;
- LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
+ LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d, frame %d, slot %d)\n",
+ (ra->msg3_dcch_dtch?ra->crnti:ra->rnti), ra->state, ra->Msg4_frame, ra->Msg4_slot);
}
else {
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 56a24c5b94..524f4598b3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -324,6 +324,8 @@ int get_spf(nfapi_nr_config_request_scf_t *cfg);
int to_absslot(nfapi_nr_config_request_scf_t *cfg,int frame,int slot);
+int get_nrofHARQ_ProcessesForPDSCH(e_NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH n);
+
void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
int x_overhead,
uint8_t numdmrscdmgroupnodata,
@@ -427,6 +429,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
const uint8_t ul_cqi,
const uint16_t rssi);
+void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
+ const NR_PDSCH_ServingCellConfig_t *pdsch);
+
void handle_nr_ul_harq(const int CC_idP,
module_id_t mod_id,
frame_t frame,
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index f7bd2a5ac8..c18f4b8bba 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -169,6 +169,8 @@ typedef struct {
uint8_t msg3_cqireq;
/// Round of Msg3 HARQ
uint8_t msg3_round;
+ /// Flag to indicate if Msg3 carries a DCCH or DTCH message
+ bool msg3_dcch_dtch;
/// TBS used for Msg4
int msg4_TBsize;
/// MCS used for Msg4
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
index 5b12a90cfd..b9b638fe07 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
@@ -63,6 +63,8 @@ typedef struct nr_rlc_entity_t {
void (*max_retx_reached)(void *max_retx_reached_data,
struct nr_rlc_entity_t *entity);
void *max_retx_reached_data;
+ /* buffer status computation */
+ nr_rlc_entity_buffer_status_t bstatus;
} nr_rlc_entity_t;
nr_rlc_entity_t *new_nr_rlc_entity_am(
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
index 8db5ce31ad..aaf5492241 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
@@ -28,6 +28,19 @@
#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 */
/*************************************************************************/
@@ -114,6 +127,10 @@ static void consider_retransmission(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_list_append(&entity->retransmit_list,
&entity->retransmit_end,
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
@@ -351,6 +368,9 @@ static void process_received_ack(nr_rlc_entity_am_t *entity, int ack_sn)
}
/* remove from retransmit list */
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 */
entity->ack_list = nr_rlc_sdu_segment_list_add(sn_compare_tx, entity,
entity->ack_list, cur);
@@ -840,19 +860,6 @@ static int serialize_sdu(nr_rlc_entity_am_t *entity,
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'
* bytes
* - 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,
sdu->next = NULL;
- /* segment if necessary */
pdu_size = pdu_header_size + sdu->size;
+
+ /* update buffer status */
+ entity->common.bstatus.retx_size -= pdu_size;
+
+ /* segment if necessary */
if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu;
next_sdu = resegment(sdu, entity, size);
@@ -1436,6 +1447,9 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer,
entity->retransmit_list = next_sdu;
if (entity->retransmit_end == NULL)
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 */
@@ -1479,11 +1493,15 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
sdu->next = NULL;
+ pdu_size = pdu_header_size + sdu->size;
+
+ /* update buffer status */
+ entity->common.bstatus.tx_size -= pdu_size;
+
/* assign SN to SDU */
sdu->sdu->sn = entity->tx_next;
/* segment if necessary */
- pdu_size = pdu_header_size + sdu->size;
if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu;
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)
entity->tx_list = next_sdu;
if (entity->tx_end == NULL)
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 */
@@ -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);
}
-/* 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_t *_entity, int maxsize)
{
@@ -1549,8 +1552,8 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status(
else
ret.status_size = 0;
- ret.tx_size = tx_list_size(entity, entity->tx_list, maxsize);
- ret.retx_size = tx_list_size(entity, entity->retransmit_list, maxsize);
+ ret.tx_size = entity->common.bstatus.tx_size;
+ ret.retx_size = entity->common.bstatus.retx_size;
return ret;
}
@@ -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");
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)
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);
}
@@ -1845,6 +1856,9 @@ static void clear_entity(nr_rlc_entity_am_t *entity)
entity->retransmit_end = 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)
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
index 26ae481889..75408276d1 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
@@ -68,25 +68,15 @@ static int generate_tx_pdu(nr_rlc_entity_tm_t *entity, char *buffer, int size)
memcpy(buffer, sdu->sdu->data, sdu->size);
entity->tx_size -= sdu->size;
+
+ /* update buffer status */
+ entity->common.bstatus.tx_size -= sdu->size;
+
nr_rlc_free_sdu_segment(sdu);
return ret;
}
-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) {
- ret += l->size;
- l = l->next;
- }
-
- if (ret > maxsize) ret = maxsize;
- return ret;
-}
-
nr_rlc_entity_buffer_status_t nr_rlc_entity_tm_buffer_status(
nr_rlc_entity_t *_entity, int maxsize)
{
@@ -94,7 +84,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_tm_buffer_status(
nr_rlc_entity_buffer_status_t ret;
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;
return ret;
@@ -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);
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)
entity->tx_list = NULL;
entity->tx_end = NULL;
entity->tx_size = 0;
+
+ entity->common.bstatus.tx_size = 0;
}
void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity)
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
index 71173eee5a..7336e8f9da 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
@@ -28,6 +28,20 @@
#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 */
/*************************************************************************/
@@ -375,20 +389,6 @@ static int serialize_sdu(nr_rlc_entity_um_t *entity,
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'
* bytes
* - 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)
/* assign SN to SDU */
sdu->sdu->sn = entity->tx_next;
- /* segment if necessary */
pdu_size = pdu_header_size + sdu->size;
+
+ /* update buffer status */
+ entity->common.bstatus.tx_size -= pdu_size;
+
+ /* segment if necessary */
if (pdu_size > size) {
nr_rlc_sdu_segment_t *next_sdu;
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)
entity->tx_list = next_sdu;
if (entity->tx_end == NULL)
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 */
@@ -488,24 +495,6 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
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_t *_entity, int maxsize)
{
@@ -513,7 +502,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status(
nr_rlc_entity_buffer_status_t ret;
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;
return ret;
@@ -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);
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)
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);
}
@@ -682,6 +679,8 @@ static void clear_entity(nr_rlc_entity_um_t *entity)
entity->tx_list = NULL;
entity->tx_end = NULL;
entity->tx_size = 0;
+
+ entity->common.bstatus.tx_size = 0;
}
void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity)
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index b5c2f666a2..66c7870f80 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -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
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)
nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
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){
NR_UE_L2_STATE_t ret;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 9465b9b4b0..22109c3029 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -79,6 +79,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
int scg_id,
int servCellIndex,
int dl_antenna_ports,
+ int minRXTXTIMEpdsch,
int do_csirs,
int initial_csi_index,
int uid);
@@ -90,6 +91,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
int dl_antenna_ports,
+ int minRXTXTIMEpdsch,
int do_csirs,
int initial_csi_index,
int uid);
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index f9fce48f41..2104d5cdd7 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -241,6 +241,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts,
+ carrier->minRXTXTIMEpdsch,
carrier->do_CSIRS,
carrier->initial_csi_index[ue_context_p->local_uid + 1],
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_
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts,
+ carrier->minRXTXTIMEpdsch,
carrier->do_CSIRS,
carrier->initial_csi_index[ue_context_p->local_uid + 1],
ue_context_p->local_uid);
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 980bd39c37..4b8fd77dc5 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -55,6 +55,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
int scg_id,
int servCellIndex,
int dl_antenna_ports,
+ int minRXTXTIMEpdsch,
int do_csirs,
int initial_csi_index,
int uid) {
@@ -945,7 +946,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
long *delay[8];
for (int i=0;i<8;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]);
}
pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
@@ -1348,6 +1349,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
int dl_antenna_ports,
+ int minRXTXTIMEpdsch,
int do_csirs,
int initial_csi_index,
int uid) {
@@ -1363,6 +1365,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
1,
1,
dl_antenna_ports,
+ minRXTXTIMEpdsch,
do_csirs,
initial_csi_index,
uid);
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index d44f36e186..f71229f066 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -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);
}
-const char *X2AP_cause_str1[4]={"radioNetwork","transport","protocol","misc"};
-const char *X2AP_case_str_radio[50]={" X2AP_CauseRadioNetwork_handover_desirable_for_radio_reasons",
+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",
"X2AP_CauseRadioNetwork_time_critical_handover",
"X2AP_CauseRadioNetwork_resource_optimisation_handover",
"X2AP_CauseRadioNetwork_reduce_load_in_serving_cell",
@@ -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__);
return -1;
} else {
- AssertFatal(ie->value.present <= X2AP_Cause_PR_misc && ie->value.present > 0,"Cause value %d, is impossible\n",ie->value.present);
- LOG_I(X2AP,"Received X2AP Reset Request with Cause Type %s\n",X2AP_cause_str1[ie->value.present-1]);
+ AssertFatal(ie->value.present <= X2AP_ResetRequest_IEs__value_PR_InterfaceInstanceIndication && ie->value.present > 0,
+ "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");
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 62b89188f9..de6bafc9f7 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -1,4 +1,4 @@
-Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
@@ -7,7 +7,7 @@ gNBs =
{
////////// Identification parameters:
gNB_ID = 0xe00;
- gNB_name = "gNB-Eurecom-5GNRBox";
+ gNB_name = "gNB-OAI";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
@@ -204,7 +204,7 @@ gNBs =
};
- ////////// MME parameters:
+ ////////// AMF parameters:
amf_ip_address = ( { ipv4 = "192.168.70.132";
ipv6 = "192:168:30::17";
active = "yes";
@@ -226,59 +226,61 @@ gNBs =
);
MACRLCs = (
- {
- num_cc = 1;
- tr_s_preference = "local_L1";
- tr_n_preference = "local_RRC";
- pusch_TargetSNRx10 = 150;
- pucch_TargetSNRx10 = 200;
- }
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 150;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
);
L1s = (
- {
- num_cc = 1;
- tr_n_preference = "local_mac";
- pusch_proc_threads = 8;
- prach_dtx_threshold = 120;
- pucch0_dtx_threshold = 150;
- ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
- }
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 150;
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
);
RUs = (
- {
- local_rf = "yes"
- nb_tx = 1
- nb_rx = 1
- att_tx = 0
- att_rx = 0;
- bands = [41];
- max_pdschReferenceSignalPower = -27;
- max_rxgain = 114;
- eNB_instances = [0];
- #beamforming 1x4 matrix:
- bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
- clock_src = "internal";
- }
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [41];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ sf_extension = 0;
+ eNB_instances = [0];
+ #beamforming 1x4 matrix:
+ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ clock_src = "internal";
+}
);
THREAD_STRUCT = (
- {
- #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
- parallel_config = "PARALLEL_SINGLE_THREAD";
- #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
- worker_config = "WORKER_ENABLE";
- }
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
);
rfsimulator :
{
- serveraddr = "server";
- serverport = "4043";
- options = (); #("saviq"); or/and "chanmod"
- modelname = "AWGN";
- IQfile = "/tmp/rfsimulator.iqs";
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
};
security = {
@@ -298,23 +300,23 @@ security = {
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";
- ngap_log_level ="debug";
- ngap_log_verbosity ="medium";
- };
+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";
+ ngap_log_level ="debug";
+ ngap_log_verbosity ="medium";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
new file mode 100644
index 0000000000..abc64b6e46
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
@@ -0,0 +1,323 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+ gNB_name = "gNB-OAI";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+ plmn_list = ({
+ mcc = 208;
+ mnc = 99;
+ mnc_length = 2;
+ snssaiList = (
+ {
+ sst = 1;
+ sd = 0x1; // 0 false, else true
+ },
+ {
+ sst = 1;
+ sd = 0x112233; // 0 false, else true
+ }
+ );
+
+ });
+
+ nr_cellid = 12345678L;
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 2;
+ ul_prbblacklist = "51,52,53,54"
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 11;
+ searchSpaceZero = 0;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+ absoluteFrequencySSB = 621312; # 641280
+ dl_frequencyBand = 78;
+ # this is 3300.60 MHz
+ dl_absoluteFrequencyPointA = 620040; # 640008
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=27,L=48 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0; #for DL slot
+ initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
+ initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
+
+ initialDLBWPk0_1 = 0; #for mixed slot
+ initialDLBWPmappingType_1 = 0;
+ initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 12;
+ preambleReceivedTargetPower = -104;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 2; # used for UL slot
+ initialULBWPmappingType_0 = 1
+ initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
+
+ initialULBWPk2_1 = 2; # used for mixed slot
+ initialULBWPmappingType_1 = 1;
+ initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4
+
+ initialULBWPk2_2 = 7; # used for Msg.3 during RA
+ initialULBWPmappingType_2 = 1;
+ initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # 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;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "192.168.70.132";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+
+ NETWORK_INTERFACES :
+ {
+ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
+ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ #pusch_TargetSNRx10 = 150;
+ #pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 4;
+ prach_dtx_threshold = 120;
+ #pucch0_dtx_threshold = 120;
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 2
+ nb_rx = 2
+ att_tx = 0
+ att_rx = 0;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ sf_extension = 0;
+ eNB_instances = [0];
+ ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ #clock_src = "internal";
+ sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal"
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # 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";
+ ngap_log_level ="debug";
+ ngap_log_verbosity ="medium";
+ f1ap_log_level ="debug";
+ f1ap_log_verbosity ="medium";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index ac8622fbc5..83b39b85ec 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -1,4 +1,4 @@
-Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
@@ -7,7 +7,7 @@ gNBs =
{
////////// Identification parameters:
gNB_ID = 0xe00;
- gNB_name = "gNB-Eurecom-5GNRBox";
+ gNB_name = "gNB-OAI";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
@@ -204,7 +204,7 @@ gNBs =
};
- ////////// MME parameters:
+ ////////// AMF parameters:
amf_ip_address = ( { ipv4 = "192.168.70.132";
ipv6 = "192:168:30::17";
active = "yes";
@@ -226,59 +226,61 @@ gNBs =
);
MACRLCs = (
- {
- num_cc = 1;
- tr_s_preference = "local_L1";
- tr_n_preference = "local_RRC";
- pusch_TargetSNRx10 = 150;
- pucch_TargetSNRx10 = 200;
- }
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 150;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
);
L1s = (
- {
- num_cc = 1;
- tr_n_preference = "local_mac";
- pusch_proc_threads = 8;
- prach_dtx_threshold = 120;
- pucch0_dtx_threshold = 150;
- ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
- }
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 150;
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
);
RUs = (
- {
- local_rf = "yes"
- nb_tx = 1
- nb_rx = 1
- att_tx = 0
- att_rx = 0;
- bands = [78];
- max_pdschReferenceSignalPower = -27;
- max_rxgain = 114;
- eNB_instances = [0];
- #beamforming 1x4 matrix:
- bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
- clock_src = "internal";
- }
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ sf_extension = 0;
+ eNB_instances = [0];
+ #beamforming 1x4 matrix:
+ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ clock_src = "internal";
+}
);
THREAD_STRUCT = (
- {
- #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
- parallel_config = "PARALLEL_SINGLE_THREAD";
- #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
- worker_config = "WORKER_ENABLE";
- }
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
);
rfsimulator :
{
- serveraddr = "server";
- serverport = "4043";
- options = (); #("saviq"); or/and "chanmod"
- modelname = "AWGN";
- IQfile = "/tmp/rfsimulator.iqs";
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
};
security = {
@@ -298,23 +300,23 @@ security = {
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";
- ngap_log_level ="debug";
- ngap_log_verbosity ="medium";
- };
+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";
+ ngap_log_level ="debug";
+ ngap_log_verbosity ="medium";
+};