diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa
index 772b34231a..3616b2c404 100644
--- a/ci-scripts/Jenkinsfile-trig-nsa
+++ b/ci-scripts/Jenkinsfile-trig-nsa
@@ -113,6 +113,21 @@ pipeline {
GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
echo GitPostArgs
+ //calling SA-AmariS
+ jobName = "RAN-SA-AmariS-CN5G"
+ jobStatus = build job: jobName, 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))
+ ]
+ jobResult = jobStatus.getResult()
+ build_url = jobStatus.getAbsoluteUrl()
+ build_id = jobStatus.getNumber().toString()
+ GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
+ echo GitPostArgs
+
//calling OAIUE N310-X300
jobName = "RAN-SA-OAIUE-N310-X300-CN5G"
jobStatus = build job: jobName, wait : true, propagate : false, parameters: [
diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py
index ecd8f63af1..0342333c06 100644
--- a/ci-scripts/cls_physim.py
+++ b/ci-scripts/cls_physim.py
@@ -168,7 +168,7 @@ class PhySim:
mySSH.close()
#check build status and update HTML object
- lHTML = html.HTMLManagement()
+ lHTML = cls_oai_html.HTMLManagement()
lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
return lHTML
@@ -186,6 +186,6 @@ class PhySim:
mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
mySSH.close()
#return updated HTML to main
- lHTML = html.HTMLManagement()
+ lHTML = cls_oai_html.HTMLManagement()
lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
return lHTML
diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
index d6edc09286..04dc1b1373 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
@@ -38,7 +38,7 @@ gNBs =
////////// Physical parameters:
ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts_N1 = 2;
+ pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
index 7f4b11c35d..fd52c7fed5 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
@@ -39,7 +39,7 @@ gNBs =
////////// Physical parameters:
ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts_N1 = 2;
+ pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
index fa7c190538..03155b85d8 100644
--- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
@@ -20,7 +20,7 @@ gNBs =
////////// Physical parameters:
ssb_SubcarrierOffset = 31; //0;
- pdsch_AntennaPorts_N1 = 2;
+ pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
ul_prbblacklist = "51,52,53,54"
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 8489008300..09d9b50335 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
@@ -38,7 +38,7 @@ gNBs =
////////// Physical parameters:
ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts_N1 = 2;
+ pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
ul_prbblacklist = "51,52,53,54"
do_SRS = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
index ce63578dd3..42fc89b2ed 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
@@ -38,7 +38,7 @@ gNBs =
////////// Physical parameters:
ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts_N1 = 2;
+ pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml
index 02a90c86f4..0da04dcaed 100644
--- a/ci-scripts/datalog_rt_stats.default.yaml
+++ b/ci-scripts/datalog_rt_stats.default.yaml
@@ -15,7 +15,8 @@ Ref :
DLSCH encoding : 230.0
L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0
- PUSCH decoding : 180.0
+ #PUSCH decoding : 180.0
+ PUSCH decoding : 240.0
DL & UL scheduling timing stats : 37.0
UL Indication : 38.0
Threshold :
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 97c5b9696e..680763d247 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -383,17 +383,19 @@ class RANManagement():
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
- localEpcIpAddr = EPC.IPAddress
- localEpcUserName = EPC.UserName
- localEpcPassword = EPC.Password
- mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
- eth_interface = 'any'
- fltr = 'sctp'
- logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
- self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
- mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
- mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
- mySSH.close()
+ if EPC.IPAddress != "none":
+ localEpcIpAddr = EPC.IPAddress
+ localEpcUserName = EPC.UserName
+ localEpcPassword = EPC.Password
+ mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
+ eth_interface = 'any'
+ fltr = 'sctp'
+ logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
+ self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
+ mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
+ mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
+ mySSH.close()
+
mySSH.open(lIpAddr, lUserName, lPassWord)
mySSH.command('cd ' + lSourcePath, '\$', 5)
# Initialize_eNB_args usually start with -O and followed by the location in repository
diff --git a/ci-scripts/ran_dashboard/Hdashboard.py b/ci-scripts/ran_dashboard/Hdashboard.py
index 1b65c7af4f..993d0dded8 100644
--- a/ci-scripts/ran_dashboard/Hdashboard.py
+++ b/ci-scripts/ran_dashboard/Hdashboard.py
@@ -528,15 +528,15 @@ class Dashboard:
editable_mr = project.mergerequests.get(int(mr))
mr_notes = editable_mr.notes.list(all=True)
- body = 'Consolidated Test Results
'+\
- 'Tested CommitID: ' + commit + '
'
+ body = '[Consolidated Test Results](https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html)\\\n'
+ body += 'Tested CommitID: ' + commit + '\\\n'
for i in range(0,n_tests):
jobname = args[4*i]
buildurl = args[4*i+1]
buildid = args[4*i+2]
status = args[4*i+3]
- body += jobname+', status is '+status+', ('+buildid+')
'
+ body += jobname+': **'+status+'** ([' + buildid + '](' + buildurl + '))\\\n'
#create new note
mr_note = editable_mr.notes.create({
diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
index 5705533ab4..e7eb651d50 100644
--- a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
+++ b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
@@ -24,7 +24,7 @@
gNB-PHY-Test
Run-gNB-PHY-Test
tasks
- 3
+ 1
090101 000001 090109
@@ -33,7 +33,7 @@
Initialize_eNB
Initialize gNB USRP
- -O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time
+ -O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time
NR
192.168.20.2
diff --git a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
index 6aa53200c8..0d18a52839 100644
--- a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
+++ b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
@@ -88,7 +88,7 @@
nrmodule2_quectel
-c 20
1
- 40
+ 60
Ping
@@ -96,7 +96,7 @@
nrmodule2_quectel
-c 100 -s 1024 -i 0,2
1
- 40
+ 60
diff --git a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
index 84aa87aa23..f84691ab48 100644
--- a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
+++ b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
@@ -88,7 +88,7 @@
nrmodule2_quectel
-c 20
1
- 40
+ 60
Ping
@@ -96,7 +96,7 @@
nrmodule2_quectel
-c 100 -s 1024 -i 0,2
1
- 40
+ 60
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 80c0408e13..c08d9378b8 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1542,9 +1542,10 @@ set(PHY_SRC_UE
set(PHY_NR_SRC_COMMON
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
- ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
+ ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
+ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
)
set(PHY_NR_SRC
@@ -1568,7 +1569,6 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
- ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
@@ -1616,6 +1616,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c
+ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/csi_rx.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
@@ -2842,6 +2843,7 @@ target_link_libraries(ldpctest
add_executable(nr_dlschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
+ ${OPENAIR_DIR}/executables/softmodem-common.c
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -2865,6 +2867,7 @@ target_link_libraries(nr_pbchsim
add_executable(nr_pucchsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
+ ${OPENAIR_DIR}/executables/softmodem-common.c
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -2909,6 +2912,7 @@ target_link_libraries(nr_prachsim
add_executable(nr_ulschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
+ ${OPENAIR_DIR}/executables/softmodem-common.c
${PHY_INTERFACE_DIR}/queue_t.c
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index b55228bdc9..a2c68e9ef6 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1104,7 +1104,8 @@
(Test19: Mapping type A, 3 DMRS Symbols),
(Test20: Mapping type B, 4 DMRS Symbols),
(Test21: 4x4 MIMO, 1 Layer),
- (Test22: 4x4 MIMO, 2 Layers)
+ (Test22: 4x4 MIMO, 2 Layers),
+ (Test23: 25 PRBs, 15 kHz SCS)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1132,8 +1133,9 @@
-n100 -s2 -U 2 0 2
-n100 -s2 -U 2 1 3
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
- -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
- nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22
+ -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
+ -n100 -m0 -e0 -R25 -b25 -i
+ nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23
PDSCH test OK
segmentation fault|assertion|exiting|fatal
3
@@ -1184,9 +1186,10 @@
execution
- nr_ulschsim Test cases. (Test1: 106 PRB),
- (Test2: 217 PRB),
- (Test3: 273 PRB)
+ nr_ulschsim Test cases. (Test1: 106 PRBs),
+ (Test2: 217 PRBs),
+ (Test3: 273 PRBs)
+ (Test4: 106 PRBs 4-layer MIMO)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1195,8 +1198,9 @@
$OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15
-R 106 -m9 -s13 -n100
-R 217 -m15 -s15 -n100
- -R 273 -m19 -s20 -n100
- nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3
+ -R 273 -m19 -s20 -n100
+ -R 106 -m9 -s13 -n100 -y4 -z4 -W4
+ nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 nr_ulschsim.test4
PUSCH test OK
segmentation fault|assertion|exiting|fatal
3
@@ -1304,7 +1308,10 @@
(Test12: SC-FDMA, 216 PRBs),
(Test13: SC-FDMA, 273 PRBs),
(Test14: SC-FDMA, 3 DMRS),
- (Test15: MCS 16 50 PRBs 2 RX_Antenna)
+ (Test15: MCS 19 50 PRBs 2 RX_Antenna),
+ (Test16: MCS 9 106 PRBs MIMO 2 layers),
+ (Test17: MCS 9 106 PRBs MIMO 4 layers),
+ (Test18: 25 PRBs, 15 kHz SCS)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1320,14 +1327,16 @@
-n100 -s5 -T 2 1 2 -U 2 0 2
-n100 -s5 -T 2 2 2 -U 2 1 2
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
- -n100 -s5 -Z
+ -n100 -Z -s5
-n100 -s5 -Z -r75
-n50 -s5 -Z -r216 -R217
-n50 -s5 -Z -r270 -R273
-n100 -s5 -Z -U 2 0 2
- -n100 -m16 -s10 -z2
-
- nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15
+ -n100 -m19 -s10 -S15 -z2
+ -n100 -m9 -r106 -s10 -W2 -y2 -z2
+ -n100 -m9 -r106 -s20 -W4 -y4 -z4
+ -n100 -u0 -m0 -R25 -r25 -i
+ nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18
PUSCH test OK
segmentation fault|assertion|exiting|fatal
3
@@ -1338,10 +1347,11 @@
nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
(Test2: 30kHz SCS, 217 PRBs, Prach format A2),
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
- (Test4: 30kHz SCS, 106 PRBs, Prach format 0),
+ (Test4: 30kHz SCS, 106 PRBs, Prach format 0),
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
(Test6: 120kHz SCS, 66 PRBs, Prach format A2),
- (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled)
+ (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled),
+ (Test8: 15kHz SCS, 25 PRBs)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1351,11 +1361,12 @@
-a -s -30 -n 100 -p 63 -R 106
-a -s -30 -n 100 -p 63 -R 217
-a -s -30 -n 100 -p 63 -R 273
- -a -s -30 -n 100 -p 63 -R 106 -c 4
- -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
- -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
- -a -s -30 -n 100 -R 66 -m 3 -c52 -H
- nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7
+ -a -s -30 -n 100 -p 63 -R 106 -c 4
+ -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
+ -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
+ -a -s -30 -n 100 -R 66 -m 3 -c52 -H
+ -a -s -30 -n 100 -p 99 -R 25 -m 0
+ nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 nr_prachsim.test8
PRACH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 5cafb95cba..6e788c9676 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -713,11 +713,11 @@ function main() {
# simlist="ldpctest"
for f in $simlist ; do
compilations \
- ran_build $f \
+ $BUILD_DIR $f \
$f $dbin/$f.$REL
done
compilations \
- ran_build coding \
+ $BUILD_DIR coding \
libcoding.so $dbin/libcoding.so
fi
@@ -729,7 +729,7 @@ function main() {
simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2"
for f in $simlist ; do
compilations \
- ran_build test_$f \
+ $BUILD_DIR test_$f \
test_$f $dbin/test_$f.$REL
done
fi
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index 0aeeaf3afd..af31c83d6e 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -191,67 +191,6 @@ int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart) {
return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275));
}
-/// Target code rate tables indexed by Imcs
-/* TS 38.214 table 5.1.3.1-1 - MCS index table 1 for PDSCH */
-uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \
- 616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948};
-
-/* TS 38.214 table 5.1.3.1-2 - MCS index table 2 for PDSCH */
-// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
-uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \
- 616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948};
-
-/* TS 38.214 table 5.1.3.1-3 - MCS index table 3 for PDSCH */
-uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \
- 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772};
-
-uint16_t nr_tbs_table[93] = {24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \
- 336, 352, 368, 384, 408, 432, 456, 480, 504, 528, 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \
- 1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, 2600, 2664, 2728, 2792, 2856, 2976, \
- 3104, 3240, 3368, 3496, 3624, 3752, 3824};
-
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) {
- switch(table_idx) {
- case 1:
- return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
- break;
-
- case 2:
- return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1);
- break;
-
- case 3:
- return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
- break;
-
- default:
- AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
- return(0);
- break;
- }
-}
-
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
- switch(table_idx) {
- case 1:
- return (nr_target_code_rate_table1[Imcs]);
- break;
-
- case 2:
- return (nr_target_code_rate_table2[Imcs]);
- break;
-
- case 3:
- return (nr_target_code_rate_table3[Imcs]);
- break;
-
- default:
- AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
- return(0);
- break;
- }
-}
-
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
uint8_t count=0, start=0, start_set=0;
@@ -503,7 +442,6 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
return i;
}
-
int get_subband_size(int NPRB,int size) {
// implements table 5.2.1.4-2 from 36.214
//
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index a09532a565..5258ce8809 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -69,12 +69,6 @@ int NRRIV2BW(int locationAndBandwidth,int N_RB);
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart);
-extern uint16_t nr_target_code_rate_table1[29];
-extern uint16_t nr_target_code_rate_table2[28];
-extern uint16_t nr_target_code_rate_table3[29];
-extern uint16_t nr_tbs_table[93];
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
int get_subband_size(int NPRB,int size);
void SLIV2SL(int SLIV,int *S,int *L);
int get_dmrs_port(int nl, uint16_t dmrs_ports);
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 44fae9f788..43001ec95b 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -450,6 +450,7 @@ extern "C" {
void itti_wait_tasks_end(void) {
shutting_down = false;
signal(SIGTERM, catch_sigterm);
+ //signal(SIGINT, catch_sigterm);
while (! shutting_down)
{
sleep(24 * 3600);
diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h
index d06f2195ee..e448117385 100644
--- a/common/utils/threadPool/thread-pool.h
+++ b/common/utils/threadPool/thread-pool.h
@@ -80,7 +80,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
notifiedFIFO_t *reponseFifo,
void (*processingFunc)(void *)) {
notifiedFIFO_elt_t *ret;
- AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) malloc(sizeof(notifiedFIFO_elt_t)+size+32)), "");
+ AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), "");
ret->next=NULL;
ret->key=key;
ret->reponseFifo=reponseFifo;
diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md
index a289c6d17e..d0856b415d 100644
--- a/doc/FEATURE_SET.md
+++ b/doc/FEATURE_SET.md
@@ -332,6 +332,9 @@ The following features are valid for the gNB and the 5G-NR UE.
- evalution of RSRP report
- evaluation of CQI report
- MAC scheduling of SR reception
+- Bandwidth part (BWP) operation
+ - Handle multiple dedicated BWPs
+ - BWP switching through RRCReconfiguration method
**gNB RLC**
- Send/Receive operations according to 38.322 Rel.16
@@ -493,6 +496,8 @@ The following features are valid for the gNB and the 5G-NR UE.
- Configuration of fapi PDU according to DCI
* Scheduler procedures for SRS transmission
- Periodic SRS transmission
+* Bandwidth part (BWP) operation
+ - Operation in configured dedicated BWP through RRCSetup or RRCReconfiguration
**UE RLC**
diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md
index 119027f169..2dc4fd2ff5 100644
--- a/doc/RUNMODEM.md
+++ b/doc/RUNMODEM.md
@@ -207,7 +207,24 @@ UE on machine 2:
`sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000`
+# MIMO configuration
+
+
+
+
+
+ |
+
+
+
+This image shows an example of gNB 5G MIMO logical antenna port configuration. It has to be noted that logical antenna ports might not directly correspond to physical antenna ports and each logical antenna port might consist of a sub-array of antennas.
+
+The basic element is a dual-polarized antenna, therefore the minimal DL MIMO setup with two logical antenna ports would consist of two cross-polarized antenna elements. In a single panel configuration, as the one in the picture, this element can be repeated vertiacally and/or horizontally to form an equi-spaced 1D or 2D array. The values N1 and N2 represent the number of antenna ports in the two dimensions and the supported configurations are specified in Section 5.2.2.2.1 of TS 38.214.
+
+The DL logical antenna port configuration can be selected through configuration file. `pdsch_AntennaPorts_N1` can be used to set N1 parameter, `pdsch_AntennaPorts_N2` to set N2 and `pdsch_AntennaPorts_XP` to set the cross-polarization configuration (1 for single pol, 2 for cross-pol). To be noted that if XP is 1 but N1 and/or N2 are larger than 1, this would result in a non-standard configuration and the PMI selected would be the identity matrix regardless of CSI report. The default value for each of these parameters is 1.
+
+# Additional links
[Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
diff --git a/doc/RUN_NR_multiple_BWPs.md b/doc/RUN_NR_multiple_BWPs.md
new file mode 100644
index 0000000000..2c2c2fcf25
--- /dev/null
+++ b/doc/RUN_NR_multiple_BWPs.md
@@ -0,0 +1,51 @@
+# Procedure to add dedicated Bandwidth part (BWP)
+
+## Contributed by 5G Testbed IISc
+
+### Developers: Abhijith A, Shruthi S
+
+# Terminology #
+
+## Bandwidth part (BWP) ##
+Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid.
+
+Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink.
+
+A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time.
+
+# Procedure to run multiple dedicated BWPs #
+
+A maximum of 4 dedicated BWPs can be configured for a UE.
+
+To configure multiple BWPs, add the following parameters to the gNB configuration file under "servingCellConfigDedicated":
+
+## Setup of the Configuration files ##
+```
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+```
+
+Each dedicated BWP must have:
+```
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+```
+
+ Find these parameters in this configuration file: "targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf"
+
+# Testing gNB and UE in RF simulator
+
+## gNB command:
+```
+ sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa
+```
+
+## UE command:
+```
+ sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --nokrnmod --rfsim --sa --uicc0.imsi 208990000000001
+```
\ No newline at end of file
diff --git a/doc/UL_MIMO.txt b/doc/UL_MIMO.txt
new file mode 100644
index 0000000000..c06bc78c4c
--- /dev/null
+++ b/doc/UL_MIMO.txt
@@ -0,0 +1,31 @@
+# how to build phy sim
+cd cmake_targets/
+sudo ./build_oai --phy_simulators -c
+
+cd phy_simulators/build/
+# ULSCH sim
+# bit level validation
+# PUSCH encoding and decoding for 4 layers 2 CMD without data
+sudo ./nr_ulschsim -R 106 -m9 -s13 -n100 -y4 -z4 -W4
+
+# UL sim
+# Uplink chain validation
+# PUSCH on UE side and gNB side,whole chain for PUSCH
+# No channel model on data domain signal
+# No cross-path connection
+# PMI = 0 is only unitary prcoding matrix
+sudo ./nr_ulsim -n100 -m9 -r106 -s13 -W4 -y4 -z4
+
+# How to build rfsim
+sudo ./build_oai -c --gNB --nrUE -w SIMU
+
+# How to run with rfsim
+# 4x4 RANK 4
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 4
+sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
+# 4x4 RANK 2
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 2
+sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
+
+
+
diff --git a/doc/images/mimo_antenna_ports.png b/doc/images/mimo_antenna_ports.png
new file mode 100644
index 0000000000..ef91f4becc
Binary files /dev/null and b/doc/images/mimo_antenna_ports.png differ
diff --git a/executables/main-ocp.c b/executables/main-ocp.c
index c9388e179d..5d949d5a28 100644
--- a/executables/main-ocp.c
+++ b/executables/main-ocp.c
@@ -173,7 +173,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
}
for (int i=0; iulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0)) != NULL,
"Can't get eNB ulsch structures\n");
// this is the transmission mode for the signalling channels
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index fbe757ca30..ad018b17ab 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -719,10 +719,17 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb);
- if(slot%(fp->slots_per_subframe/2))
- siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
- else
- siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+ if (fp->slots_per_subframe == 1) {
+ if (txsymb <= 7)
+ siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+ else
+ siglen = 2 * (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 2) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+ } else {
+ if(slot%(fp->slots_per_subframe/2))
+ siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+ else
+ siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+ }
//+ ru->end_of_burst_delay;
flags = 3; // end of burst
@@ -1049,11 +1056,12 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_gain[i] = ru->att_tx;
cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
cfg->configFilename = rf_config_file;
- LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n",
+ LOG_I(PHY, "Channel %d: setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f Hz\n",
i, cfg->tx_gain[i],
cfg->rx_gain[i],
- (unsigned long)cfg->tx_freq[i],
- (unsigned long)cfg->rx_freq[i]);
+ cfg->tx_freq[i],
+ cfg->rx_freq[i],
+ cfg->tune_offset);
}
}
@@ -2051,6 +2059,8 @@ static void NRRCconfig_RU(void) {
RC.ru[j]->openair0_cfg.time_source = internal;
}
+ RC.ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset;
+
if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) {
RC.ru[j]->if_south = LOCAL_RF;
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 6e36dcf6c7..1e6c556acf 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -66,6 +66,7 @@
#define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"
#define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n"
#define CONFIG_HLP_DLNL_PHYTEST "Set the downlink nrOfLayers for PHYTEST mode\n"
+#define CONFIG_HLP_ULNL_PHYTEST "Set the uplink nrOfLayers for PHYTEST mode\n"
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
#define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n"
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 1c75d9a155..54345dc6b0 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -839,10 +839,10 @@ int main( int argc, char **argv ) {
}
for (int inst = 0; inst < NB_RU; inst++) {
+ kill_NR_RU_proc(inst);
nr_phy_free_RU(RC.ru[inst]);
}
- free_lte_top();
pthread_cond_destroy(&sync_cond);
pthread_mutex_destroy(&sync_mutex);
pthread_cond_destroy(&nfapi_sync_cond);
diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h
index 834e89b403..7d2184f01b 100644
--- a/executables/nr-softmodem.h
+++ b/executables/nr-softmodem.h
@@ -22,6 +22,7 @@
{"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \
{"m" , CONFIG_HLP_DLMCS_PHYTEST,0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \
{"l" , CONFIG_HLP_DLNL_PHYTEST,0, uptr:&target_dl_Nl, defintval:0, TYPE_UINT, 0}, \
+ {"L" , CONFIG_HLP_ULNL_PHYTEST,0, uptr:&target_ul_Nl, defintval:0, TYPE_UINT, 0}, \
{"t" , CONFIG_HLP_ULMCS_PHYTEST,0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \
{"M" , CONFIG_HLP_DLBW_PHYTEST,0, uptr:&target_dl_bw, defintval:0, TYPE_UINT, 0}, \
{"T" , CONFIG_HLP_ULBW_PHYTEST,0, uptr:&target_ul_bw, defintval:0, TYPE_UINT, 0}, \
@@ -36,6 +37,7 @@
extern threads_t threads;
extern uint32_t target_dl_mcs;
extern uint32_t target_dl_Nl;
+extern uint32_t target_ul_Nl;
extern uint32_t target_ul_mcs;
extern uint32_t target_dl_bw;
extern uint32_t target_ul_bw;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index f643344a2b..6e1864f290 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -613,7 +613,7 @@ void processSlotTX(void *arg) {
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
uint8_t gNB_id = 0;
- LOG_D(PHY,"%d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type);
+ LOG_D(PHY,"processSlotTX %d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type);
if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
// trigger L2 to run ue_scheduler thru IF module
@@ -713,7 +713,8 @@ void processSlotRX(void *arg) {
LOG_D(PHY, "Sending Uplink data \n");
nr_ue_pusch_common_procedures(UE,
proc->nr_slot_tx,
- &UE->frame_parms,1);
+ &UE->frame_parms,
+ UE->frame_parms.nb_antennas_tx);
}
if (UE->UE_mode[gNB_id] > NOT_SYNCHED && UE->UE_mode[gNB_id] < PUSCH) {
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index b1960faf7d..2347055402 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -354,6 +354,7 @@ void init_openair0(void) {
openair0_cfg[card].num_rb_dl = frame_parms->N_RB_DL;
openair0_cfg[card].clock_source = get_softmodem_params()->clock_source;
openair0_cfg[card].time_source = get_softmodem_params()->timing_source;
+ openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset;
openair0_cfg[card].tx_num_channels = min(4, frame_parms->nb_antennas_tx);
openair0_cfg[card].rx_num_channels = min(4, frame_parms->nb_antennas_rx);
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index eb0c1a54f7..72a9491f27 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -60,6 +60,7 @@ extern "C"
#define CONFIG_HLP_DMRSSYNC "tells RU to insert DMRS in subframe 1 slot 0"
#define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n"
#define CONFIG_HLP_TME "tells hardware to use a time reference (0:internal, 1:external, 2:gpsdo)\n"
+#define CONFIG_HLP_TUNE_OFFSET "LO tuning offset to use in Hz\n"
#define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n"
#define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n"
#define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n"
@@ -118,6 +119,7 @@ extern "C"
#define EMULATE_RF softmodem_params.emulate_rf
#define CLOCK_SOURCE softmodem_params.clock_source
#define TIMING_SOURCE softmodem_params.timing_source
+#define TUNE_OFFSET softmodem_params.tune_offset
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
#define USIM_TEST softmodem_params.usim_test
#define PRB_INTERPOLATION softmodem_params.prb_interpolation
@@ -141,6 +143,7 @@ extern int usrp_tx_thread;
{"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&USIM_TEST, defintval:0, TYPE_UINT8, 0}, \
{"clock-source", CONFIG_HLP_CLK, 0, uptr:&CLOCK_SOURCE, defintval:0, TYPE_UINT, 0}, \
{"time-source", CONFIG_HLP_TME, 0, uptr:&TIMING_SOURCE, defintval:0, TYPE_UINT, 0}, \
+ {"tune-offset", CONFIG_HLP_TUNE_OFFSET, 0, dblptr:&TUNE_OFFSET, defintval:0, TYPE_DOUBLE, 0}, \
{"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC, defintval:0, TYPE_INT, 0}, \
{"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG, defintval:0, TYPE_INT, 0}, \
{"C" , CONFIG_HLP_DLF, 0, u64ptr:&(downlink_frequency[0][0]), defuintval:0, TYPE_UINT64, 0}, \
@@ -245,6 +248,7 @@ typedef struct {
int band;
uint32_t clock_source;
uint32_t timing_source;
+ double tune_offset;
int hw_timing_advance;
uint32_t send_dmrs_sync;
int prb_interpolation;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
index 7fb42e566a..ba66daa9c0 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
@@ -10,7 +10,8 @@
#define FAPI_NR_MAX_RA_OCCASION_PER_CSIRS 64
// Constants Defined in 38.213
#define FAPI_NR_MAX_CORESET_PER_BWP 3
-#define FAPI_NR_MAX_SS 10
+#define FAPI_NR_MAX_SS_PER_BWP 10
+#define FAPI_NR_MAX_SS FAPI_NR_MAX_SS_PER_BWP*NR_MAX_NUM_BWP
/// RX_IND
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index b63c1b5aad..fd9af01720 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -308,6 +308,7 @@ typedef struct
uint8_t transform_precoding;
uint16_t data_scrambling_id;
uint8_t nrOfLayers;
+ uint8_t Tpmi;
//DMRS
uint16_t ul_dmrs_symb_pos;
uint8_t dmrs_config_type;
@@ -433,6 +434,9 @@ typedef struct {
uint8_t mcs;
uint8_t ndi;
uint8_t rv;
+ uint16_t targetCodeRate;
+ uint8_t qamModOrder;
+ uint32_t TBS;
uint8_t tb2_mcs;
uint8_t tb2_ndi;
uint8_t tb2_rv;
@@ -477,20 +481,20 @@ typedef struct {
typedef struct {
- uint16_t bwp_size;//
- uint16_t bwp_start;//
- uint8_t subcarrier_spacing;//
- uint8_t cyclic_prefix;//
- uint16_t start_rb;
- uint16_t nr_of_rbs;
- uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP
- uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18
- uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter
- uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13
- uint8_t symb_l1;//
- uint8_t cdm_type;
- uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three
- uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023
+ uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
+ uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
+ uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
+ uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
+ uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
+ uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
+ uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
+ uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
+ uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
+ uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
+ uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
+ uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
+ uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
+ uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
} fapi_nr_dl_config_csirs_pdu_rel15_t;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index def9af3e7a..8b564a5e37 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -925,32 +925,24 @@ typedef struct
} nfapi_nr_dlsch_pdu_t;
*/
-//for csi-rs_pdu:
-
-//table 3-39
typedef struct
{
- uint16_t bwp_size;//
- uint16_t bwp_start;//
- uint8_t subcarrier_spacing;//
- uint8_t cyclic_prefix;//
- uint16_t start_rb;
- uint16_t nr_of_rbs;
- uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP
- uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18
- uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter
- uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13
- uint8_t symb_l1;//
- uint8_t cdm_type;
- uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three
- uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023
- //tx power info
- uint8_t power_control_offset;//Ratio of PDSCH EPRE to NZP CSI-RSEPRE Value :0->23 representing -8 to 15 dB in 1dB steps
- uint8_t power_control_offset_ss;//Ratio of SSB/PBCH block EPRE to NZP CSI-RS EPRES 0: -3dB, 1: 0dB, 2: 3dB, 3: 6dB
-
+ uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
+ uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
+ uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
+ uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
+ uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
+ uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
+ uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
+ uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
+ uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
+ uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
+ uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
+ uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
+ uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
+ uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
} nfapi_nr_dl_tti_csi_rs_pdu_rel15_t;
-//for ssb_pdu:
typedef struct
{
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index 3adde23e7d..98f89f599c 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -200,8 +200,6 @@ static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppW
static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
return(
- push16(value->bwp_size, ppWritePackedMsg, end) &&
- push16(value->bwp_start, ppWritePackedMsg, end) &&
push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
push16(value->start_rb, ppWritePackedMsg, end) &&
@@ -3663,8 +3661,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
return(
- pull16(ppReadPackedMsg, &value->bwp_size, end) &&
- pull16(ppReadPackedMsg, &value->bwp_start, end) &&
pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
pull16(ppReadPackedMsg, &value->start_rb, end) &&
diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h
index 51cae1bd8c..9972a47ee7 100644
--- a/openair1/PHY/CODING/coding_defs.h
+++ b/openair1/PHY/CODING/coding_defs.h
@@ -469,18 +469,6 @@ int32_t nr_segmentation(unsigned char *input_buffer,
unsigned int *F,
uint8_t BG);
-/*!\fn uint32_t nr_compute_tbs
-\brief This function returns the TBS in bits as per 6.1.4.2 of TS 38.214
-*/
-uint32_t nr_compute_tbs(uint16_t Qm,
- uint16_t R,
- uint16_t nb_rb,
- uint16_t nb_symb_sch,
- uint16_t nb_dmrs_prb,
- uint16_t nb_rb_oh,
- uint8_t tb_scaling,
- uint8_t Nl);
-
void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f);
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f);
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 9ffc0f75ad..56327a9b0f 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -136,7 +136,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
}
}
- int max_mimo_layers =(CSI_RS_antenna_portsnr_mimo_precoding_matrix = (int32_t ***)malloc16(max_mimo_layers* sizeof(int32_t **));
int32_t ***mat = gNB->nr_mimo_precoding_matrix;
@@ -236,7 +236,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
if((llb != ll) || (mmb != mm) || ((N1 == 1) && (N2 == 1))){
pmiq += 1;
mat[1][pmiq] = (int32_t *)malloc16((2*N1*N2)*(2)*sizeof(int32_t));
- LOG_I(PHY, "layer 2 Codebook pmiq = %d\n",pmiq);
+ LOG_D(PHY, "layer 2 Codebook pmiq = %d\n",pmiq);
for(int j_col=0; j_col<2; j_col++) {
if (j_col==0) {
llc = llb;
@@ -320,7 +320,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
if((llb != ll) || (mmb != mm)){
pmiq += 1;
mat[2][pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t));
- LOG_I(PHY, "layer 3 Codebook pmiq = %d\n",pmiq);
+ LOG_D(PHY, "layer 3 Codebook pmiq = %d\n",pmiq);
for(int j_col=0; j_col<3; j_col++) {
if (j_col==0) {
llc = llb;
@@ -411,7 +411,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
if((llb != ll) || (mmb != mm)){
pmiq += 1;
mat[3][pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t));
- LOG_I(PHY, "layer 4 pmiq = %d\n",pmiq);
+ LOG_D(PHY, "layer 4 pmiq = %d\n",pmiq);
for(int j_col=0; j_col<4; j_col++) {
if (j_col==0) {
llc = llb;
@@ -593,26 +593,23 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
nr_gold_pusch(gNB, nscid, gNB->pusch_gold_init[nscid]);
}
- //CSI RS init
- gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
- uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
- AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
-
+ // CSI RS init
// ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32)
int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1;
-
+ gNB->nr_csi_rs_info = (nr_csi_rs_info_t *)malloc16_clear(sizeof(nr_csi_rs_info_t));
+ gNB->nr_csi_rs_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
+ AssertFatal(gNB->nr_csi_rs_info->nr_gold_csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
for (int slot=0; slotslots_per_frame; slot++) {
- csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
- AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
-
+ gNB->nr_csi_rs_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
+ AssertFatal(gNB->nr_csi_rs_info->nr_gold_csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
for (int symb=0; symbsymbols_per_slot; symb++) {
- csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t));
- AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
+ gNB->nr_csi_rs_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t));
+ AssertFatal(gNB->nr_csi_rs_info->nr_gold_csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
}
}
- gNB->csi_gold_init = cfg->cell_config.phy_cell_id.value;
- nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value);
+ gNB->nr_csi_rs_info->csi_gold_init = cfg->cell_config.phy_cell_id.value;
+ nr_init_csi_rs(&gNB->frame_parms, gNB->nr_csi_rs_info->nr_gold_csi_rs, cfg->cell_config.phy_cell_id.value);
for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
@@ -673,14 +670,18 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
int n_buf = Prx*max_ul_mimo_layers;
+ int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB;
+#ifdef __AVX2__
+ int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
+#else
+ int nb_re_pusch2 = nb_re_pusch;
+#endif
+
for (int ULSCH_id=0; ULSCH_idnumber_of_nr_ulsch_max; ULSCH_id++) {
pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
pusch_vars[ULSCH_id]->rxdataF_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
- pusch_vars[ULSCH_id]->rxdataF_ext2 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ul_ch_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
- pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
- pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ptrs_phase_per_slot = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
@@ -688,25 +689,33 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
- pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(n_buf*sizeof(int32_t*) );
+ pusch_vars[ULSCH_id]->rho = (int32_t ***)malloc16(Prx*sizeof(int32_t **) );
+ pusch_vars[ULSCH_id]->llr_layers = (int16_t **)malloc16(max_ul_mimo_layers*sizeof(int32_t *) );
for (i=0; irxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
- pusch_vars[ULSCH_id]->rxdataF_ext2[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->rho[i] = (int32_t **)malloc16_clear(NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t*));
+
+ for (int j=0; j< max_ul_mimo_layers; j++) {
+ for (int k=0; krho[i][j*max_ul_mimo_layers+k]=(int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ }
+ }
}
for (i=0; iul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
- pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
- pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
- pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs
- pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot); // symbols per slot
- pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
- pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
- pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
- pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
- pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
- pusch_vars[ULSCH_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) );
+ pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+ }
+
+ for (i=0; i< max_ul_mimo_layers; i++) {
+ pusch_vars[ULSCH_id]->llr_layers[i] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
}
pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
pusch_vars[ULSCH_id]->ul_valid_re_per_slot = (int16_t *)malloc16_clear( sizeof(int16_t)*fp->symbols_per_slot);
@@ -766,13 +775,14 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
}
free_and_zero(pusch_dmrs);
- uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
+ uint32_t ***nr_gold_csi_rs = gNB->nr_csi_rs_info->nr_gold_csi_rs;
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
for (int symb = 0; symb < fp->symbols_per_slot; symb++)
- free_and_zero(csi_rs[slot][symb]);
- free_and_zero(csi_rs[slot]);
+ free_and_zero(nr_gold_csi_rs[slot][symb]);
+ free_and_zero(nr_gold_csi_rs[slot]);
}
- free_and_zero(csi_rs);
+ free_and_zero(nr_gold_csi_rs);
+ free_and_zero(gNB->nr_csi_rs_info);
for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) {
for (int i = 0; i < Prx; i++) {
@@ -823,30 +833,31 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
NR_gNB_PUSCH** pusch_vars = gNB->pusch_vars;
for (int ULSCH_id=0; ULSCH_idnumber_of_nr_ulsch_max; ULSCH_id++) {
+ for (int i=0; i< max_ul_mimo_layers; i++)
+ free_and_zero(pusch_vars[ULSCH_id]->llr_layers[i]);
for (int i = 0; i < Prx; i++) {
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
- free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
+ for (int j=0; j< max_ul_mimo_layers; j++) {
+ for (int k=0; krho[i][j*max_ul_mimo_layers+k]);
+ }
+ free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
}
for (int i = 0; i < n_buf; i++) {
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
- free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]);
- free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]);
free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]);
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag[i]);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
- free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
}
+ free_and_zero(pusch_vars[ULSCH_id]->llr_layers);
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
- free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext);
- free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates);
- free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext);
free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot);
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time);
free_and_zero(pusch_vars[ULSCH_id]->ul_valid_re_per_slot);
@@ -910,7 +921,12 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
//gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
gNB->mac_enabled = 1;
- if (mu==1) {
+ if (mu==0) {
+ fp->dl_CarrierFreq = 2600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+ fp->ul_CarrierFreq = 2600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
+ fp->nr_band = 38;
+ // fp->threequarter_fs= 0;
+ } else if (mu==1) {
fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
fp->nr_band = 78;
@@ -1032,7 +1048,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB) {
for (int i=0; inumber_of_nr_ulsch_max; i++) {
- LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH %d/%d\n",i,gNB->number_of_nr_ulsch_max);
+ LOG_I(PHY,"Allocating Transport Channel Buffers for ULSCH %d/%d\n",i,gNB->number_of_nr_ulsch_max);
gNB->ulsch[i] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL);
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 07f1d3b9e3..b1a01fb3dc 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -41,7 +41,7 @@ int nr_phy_init_RU(RU_t *ru) {
int p;
int re;
- LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d\n",ru_if_types[ru->if_south],ru->nb_tx);
+ LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d, nb_rx %d\n",ru_if_types[ru->if_south],ru->nb_tx, ru->nb_rx);
nfapi_nr_config_request_scf_t *cfg;
ru->nb_log_antennas=0;
@@ -124,9 +124,10 @@ int nr_phy_init_RU(RU_t *ru) {
ru->num_gNB,NUMBER_OF_gNB_MAX);
LOG_I(PHY,"[INIT] %s() ru->num_gNB:%d \n", __FUNCTION__, ru->num_gNB);
- if (ru->do_precoding == 1) {
+
+ if (ru->do_precoding == 1) {
int beam_count = 0;
- if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1
+ if (ru->nb_tx>1) { //Enable beamforming when nb_tx > 1
for (p=0;pnb_log_antennas;p++) {
//if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
@@ -149,7 +150,7 @@ int nr_phy_init_RU(RU_t *ru) {
} // for j
//}
} // for p
- } //for i
+ } // for i
}
ru->common.beam_id = (uint8_t**)malloc16_clear(ru->nb_tx*sizeof(uint8_t*));
@@ -205,12 +206,11 @@ void nr_phy_free_RU(RU_t *ru)
free_and_zero(ru->prach_rxsigF[j][i]);
free_and_zero(ru->prach_rxsigF[j]);
}
-
if (ru->do_precoding == 1) {
for (i = 0; i < ru->num_gNB; i++) {
for (p = 0; p < ru->nb_log_antennas; p++) {
- for (j=0; jnb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
- free_and_zero(ru->beam_weights[i][p]);
+ for (j=0; jnb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
+ free_and_zero(ru->beam_weights[i][p]);
}
}
for(i=0; i< ru->nb_tx; ++i)
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 0ecf925e45..2daee6e1ee 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -76,7 +76,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
- pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
// the allocated memory size is fixed:
AssertFatal( fp->nb_antennas_rx <= 4, "nb_antennas_rx > 4" );//Extend the max number of UE Rx antennas to 4
@@ -86,7 +85,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->rxdataF_uespec_pilots[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
pdsch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
pdsch->ptrs_re_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14);
- pdsch->dl_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num);
pdsch->rho[i] = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t *) );
for (int j=0; jrxdataF_uespec_pilots[i]);
free_and_zero(pdsch->ptrs_phase_per_slot[i]);
free_and_zero(pdsch->ptrs_re_per_slot[i]);
- free_and_zero(pdsch->dl_ch_ptrs_estimates_ext[i]);
free_and_zero(pdsch->rho[i]);
}
free_and_zero(pdsch->pmi_ext);
@@ -149,7 +146,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp
free_and_zero(pdsch->dl_ch_magr0);
free_and_zero(pdsch->ptrs_phase_per_slot);
free_and_zero(pdsch->ptrs_re_per_slot);
- free_and_zero(pdsch->dl_ch_ptrs_estimates_ext);
}
int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
@@ -159,10 +155,12 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
NR_UE_COMMON *const common_vars = &ue->common_vars;
NR_UE_PBCH **const pbch_vars = ue->pbch_vars;
NR_UE_PRACH **const prach_vars = ue->prach_vars;
- int i,slot,symb, gNB_id, th_id;
-
+ NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars;
+ NR_UE_CSI_RS **const csirs_vars = ue->csirs_vars;
NR_UE_SRS **const srs_vars = ue->srs_vars;
+ int i, j, slot, symb, gNB_id, th_id;
+
LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx);
phy_init_nr_top(ue);
@@ -342,9 +340,45 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
prach_vars[gNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH));
pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH));
+ csiim_vars[gNB_id] = (NR_UE_CSI_IM *)malloc16_clear(sizeof(NR_UE_CSI_IM));
+ csirs_vars[gNB_id] = (NR_UE_CSI_RS *)malloc16_clear(sizeof(NR_UE_CSI_RS));
srs_vars[gNB_id] = (NR_UE_SRS *)malloc16_clear(sizeof(NR_UE_SRS));
+ csiim_vars[gNB_id]->active = false;
+ csirs_vars[gNB_id]->active = false;
srs_vars[gNB_id]->active = false;
+
+ // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32)
+ int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1;
+ ue->nr_csi_rs_info = (nr_csi_rs_info_t *)malloc16_clear(sizeof(nr_csi_rs_info_t));
+ ue->nr_csi_rs_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
+ AssertFatal(ue->nr_csi_rs_info->nr_gold_csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
+ for (int slot=0; slotslots_per_frame; slot++) {
+ ue->nr_csi_rs_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
+ AssertFatal(ue->nr_csi_rs_info->nr_gold_csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
+ for (int symb=0; symbsymbols_per_slot; symb++) {
+ ue->nr_csi_rs_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t));
+ AssertFatal(ue->nr_csi_rs_info->nr_gold_csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
+ }
+ }
+ ue->nr_csi_rs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t));
+ ue->nr_csi_rs_info->csi_rs_generated_signal = (int32_t **)malloc16(NR_MAX_NB_PORTS * sizeof(int32_t *) );
+ for (i=0; inr_csi_rs_info->csi_rs_generated_signal[i] = (int32_t *) malloc16_clear(fp->samples_per_frame_wCP * sizeof(int32_t));
+ }
+ ue->nr_csi_rs_info->csi_rs_received_signal = (int32_t **)malloc16(fp->nb_antennas_rx * sizeof(int32_t *) );
+ ue->nr_csi_rs_info->csi_rs_ls_estimated_channel = (int32_t ***)malloc16(fp->nb_antennas_rx * sizeof(int32_t **) );
+ ue->nr_csi_rs_info->csi_rs_estimated_channel_freq = (int32_t ***)malloc16(fp->nb_antennas_rx * sizeof(int32_t **) );
+ for (i=0; inb_antennas_rx; i++) {
+ ue->nr_csi_rs_info->csi_rs_received_signal[i] = (int32_t *) malloc16_clear(fp->samples_per_frame_wCP * sizeof(int32_t));
+ ue->nr_csi_rs_info->csi_rs_ls_estimated_channel[i] = (int32_t **) malloc16_clear(NR_MAX_NB_PORTS * sizeof(int32_t *));
+ ue->nr_csi_rs_info->csi_rs_estimated_channel_freq[i] = (int32_t **) malloc16_clear(NR_MAX_NB_PORTS * sizeof(int32_t *));
+ for (j=0; jnr_csi_rs_info->csi_rs_ls_estimated_channel[i][j] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size * sizeof(int32_t));
+ ue->nr_csi_rs_info->csi_rs_estimated_channel_freq[i][j] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size * sizeof(int32_t));
+ }
+ }
+
ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t));
ue->nr_srs_info->srs_generated_signal = (int32_t *) malloc16_clear( (2*(fp->samples_per_frame)+2048)*sizeof(int32_t) );
@@ -463,6 +497,32 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero(ue->pdcch_vars[th_id][gNB_id]);
}
+ for (int i=0; inr_csi_rs_info->csi_rs_generated_signal[i]);
+ }
+ for (int i = 0; i < fp->nb_antennas_rx; i++) {
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_received_signal[i]);
+ for (int j=0; jnr_csi_rs_info->csi_rs_ls_estimated_channel[i][j]);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq[i][j]);
+ }
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_ls_estimated_channel[i]);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq[i]);
+ }
+ for (int slot=0; slotslots_per_frame; slot++) {
+ for (int symb=0; symbsymbols_per_slot; symb++) {
+ free_and_zero(ue->nr_csi_rs_info->nr_gold_csi_rs[slot][symb]);
+ }
+ free_and_zero(ue->nr_csi_rs_info->nr_gold_csi_rs[slot]);
+ }
+ free_and_zero(ue->nr_csi_rs_info->noise_power);
+ free_and_zero(ue->nr_csi_rs_info->nr_gold_csi_rs);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_generated_signal);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_received_signal);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_ls_estimated_channel);
+ free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq);
+ free_and_zero(ue->nr_csi_rs_info);
+
for (int i = 0; i < fp->nb_antennas_rx; i++) {
free_and_zero(ue->nr_srs_info->srs_received_signal[i]);
free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel[i]);
@@ -480,6 +540,8 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted);
free_and_zero(ue->nr_srs_info);
+ free_and_zero(ue->csiim_vars[gNB_id]);
+ free_and_zero(ue->csirs_vars[gNB_id]);
free_and_zero(ue->srs_vars[gNB_id]);
free_and_zero(ue->pbch_vars[gNB_id]);
@@ -500,7 +562,7 @@ void term_nr_ue_transport(PHY_VARS_NR_UE *ue)
for (int k = 0; k < RX_NB_TH_MAX; k++) {
free_nr_ue_dlsch(&ue->dlsch[k][i][j], N_RB_DL);
if (j==0)
- free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL);
+ free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL, &ue->frame_parms);
}
}
@@ -521,7 +583,7 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue) {
AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL))!=NULL,"Can't get ue dlsch structures\n");
LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]);
if (j==0) {
- AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES))!=NULL,"Can't get ue ulsch structures\n");
+ AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES,&ue->frame_parms))!=NULL,"Can't get ue ulsch structures\n");
LOG_D(PHY,"ulsch[%d][%d] => %p\n",k,i,ue->ulsch[k][i]);
}
}
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index b1a108f247..8352a7f5a6 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -665,8 +665,9 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp)
{
+ const int sample_offset = fp->nb_prefix_samples / fp->ofdm_offset_divisor;
for (int i = 0; i < fp->ofdm_symbol_size; i++) {
- double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor;
+ double poff = -i * 2.0 * M_PI * sample_offset / fp->ofdm_symbol_size;
double exp_re = cos(poff);
double exp_im = sin(-poff);
fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767);
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index eb26dfc02b..139b730ce1 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -34,47 +34,6 @@
#define LOG_I(A,B...) printf(A)
#endif*/
-dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size)
-{
- switch (ofdm_symbol_size) {
- case 128:
- return DFT_128;
-
- case 256:
- return DFT_256;
-
- case 512:
- return DFT_512;
-
- case 1024:
- return DFT_1024;
-
- case 1536:
- return DFT_1536;
-
- case 2048:
- return DFT_2048;
-
- case 3072:
- return DFT_3072;
-
- case 4096:
- return DFT_4096;
-
- case 6144:
- return DFT_6144;
-
- case 8192:
- return DFT_8192;
-
- default:
- printf("unsupported ofdm symbol size \n");
- assert(0);
- }
-
- return DFT_SIZE_IDXTABLESIZE;
-}
-
int nr_slot_fep(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
@@ -96,7 +55,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
nb_prefix_samples0 = frame_parms->nb_prefix_samples;
}
- dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
// This is for misalignment issues
int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
@@ -195,7 +154,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
}
unsigned int frame_length_samples = frame_parms->samples_per_frame;
- dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
// This is for misalignment issues
int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
@@ -289,7 +248,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
unsigned int nb_prefix_samples = frame_parms->nb_prefix_samples;
unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
- dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
// This is for misalignment issues
int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 4a6f8ef9af..7b526876da 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -86,7 +86,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
int pilot[3280] __attribute__((aligned(16)));
unsigned char aarx;
- unsigned short k;
+ unsigned short k0;
unsigned int pilot_cnt,re_cnt;
int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch;
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
@@ -112,18 +112,18 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
- k = bwp_start_subcarrier;
+ k0 = bwp_start_subcarrier;
int re_offset;
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
- LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d OFDM size %d, Ns = %d, k = %d symbol %d\n",
+ LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
__FUNCTION__,
ch_offset, soffset,
symbol_offset,
gNB->frame_parms.ofdm_symbol_size,
Ns,
- k,
+ k0,
symbol);
switch (nushift) {
@@ -146,7 +146,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
fr = filt8_r1;
fmm = filt8_mm1;
fml = filt8_ml1;
- fmr = filt8_m1;
+ fmr = filt8_mm1;
fdcl = filt8_dcl1;
fdcr = filt8_dcr1;
fdclh = filt8_dcl1_h;
@@ -169,10 +169,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
gNB->pusch_gold_init[pusch_pdu->scid] = pusch_pdu->ul_dmrs_scrambling_id;
nr_gold_pusch(gNB, pusch_pdu->scid, pusch_pdu->ul_dmrs_scrambling_id);
}
-
- // transform precoding = 1 means disabled
- if (pusch_pdu->transform_precoding == 1) {
- nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch,
+ if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
+ nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], (1000+p), 0, nb_rb_pusch,
(pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
}
else { // if transform precoding or SC-FDMA is enabled in Uplink
@@ -208,214 +206,82 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
}
#endif
+ uint8_t b_shift = pusch_pdu->nrOfLayers == 1;
+
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
- re_offset = k; /* Initializing the Resource element offset for each Rx antenna */
-
pil = (int16_t *)&pilot[0];
- rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+k+nushift)];
+ rxF = (int16_t *)&rxdataF[aarx][(soffset + symbol_offset + k0 + nushift)];
ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
- re_offset = k;
+ re_offset = k0;
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
#ifdef DEBUG_PUSCH
LOG_I(PHY, "In %s symbol_offset %d, nushift %d\n", __FUNCTION__, symbol_offset, nushift);
LOG_I(PHY, "In %s ch est pilot addr %p, N_RB_UL %d\n", __FUNCTION__, &pilot[0], gNB->frame_parms.N_RB_UL);
- LOG_I(PHY, "In %s bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k, gNB->frame_parms.first_carrier_offset, nb_rb_pusch);
+ LOG_I(PHY, "In %s bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k0, gNB->frame_parms.first_carrier_offset, nb_rb_pusch);
LOG_I(PHY, "In %s rxF addr %p p %d\n", __FUNCTION__, rxF, p);
LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift);
#endif
- //if ((gNB->frame_parms.N_RB_UL&1)==0) {
- if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0){
+ if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0) {
+
LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
- // Treat first 2 pilots specially (left edge)
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+ // For configuration type 1: k = 4*n + 2*k' + delta,
+ // where k' is 0 or 1, and delta is in Table 6.4.1.1.3-1 from TS 38.211
+
+ pilot_cnt = 0;
+ int delta = nr_pusch_dmrs_delta(pusch_dmrs_type1, p);
+
+ for (int n = 0; n < 3*nb_rb_pusch; n++) {
+
+ // LS estimation
+ ch[0] = 0;
+ ch[1] = 0;
+ for (int k_line = 0; k_line <= 1; k_line++) {
+ re_offset = (k0 + (n << 2) + (k_line << 1) + delta) % gNB->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)];
+ ch[0] += (int16_t) (((int32_t) pil[0] * rxF[0] - (int32_t) pil[1] * rxF[1]) >> (15+b_shift));
+ ch[1] += (int16_t) (((int32_t) pil[0] * rxF[1] + (int32_t) pil[1] * rxF[0]) >> (15+b_shift));
+ pil += 2;
+ }
+
+ // Channel interpolation
+ for (int k_line = 0; k_line <= 1; k_line++) {
#ifdef DEBUG_PUSCH
- LOG_I(PHY, "In %s ch 0 %d\n", __FUNCTION__, ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
- LOG_I(PHY, "In %s pilot 0 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
- __FUNCTION__,
- rxF[0],
- rxF[1],
- dBc(rxF[0],rxF[1]),
- ch[0],
- ch[1],
- dBc(ch[0],ch[1]),
- pil[0],
- pil[1]);
- LOG_I(PHY, "In %s data 0 : rxF - > (%d,%d) (%d)\n", __FUNCTION__, rxF[2], rxF[3], dBc(rxF[2],rxF[3]));
+ re_offset = (k0 + (n << 2) + (k_line << 1)) % gNB->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)];
+ printf("pilot %4u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n",
+ pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch[0], ch[1]);
+ //printf("data %4u: rxF -> (%4d,%4d) (%2d)\n",pilot_cnt, rxF[2], rxF[3], dBc(rxF[2], rxF[3]));
#endif
-
- multadd_real_vector_complex_scalar(fl,
- ch,
- ul_ch,
- 8);
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
- //for (int i= 0; i<8; i++)
- //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
-#ifdef DEBUG_PUSCH
- LOG_I(PHY, "In %s pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
- __FUNCTION__,
- rxF[0],
- rxF[1],
- dBc(rxF[0],rxF[1]),
- ch[0],
- ch[1],
- dBc(ch[0],ch[1]),
- pil[0],
- pil[1]);
- LOG_I(PHY, "In %s data 1 : rxF - > (%d,%d) (%d)\n",
- __FUNCTION__,
- rxF[2],
- rxF[3],
- dBc(rxF[2],rxF[3]));
-#endif
-
- multadd_real_vector_complex_scalar(fml,
- ch,
- ul_ch,
- 8);
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
- //printf("ul_ch addr %p\n",ul_ch);
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
-#ifdef DEBUG_PUSCH
- LOG_I(PHY, "In %s pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
- __FUNCTION__,
- rxF[0],
- rxF[1],
- dBc(rxF[0],rxF[1]),
- ch[0],
- ch[1],
- dBc(ch[0],ch[1]),
- pil[0],
- pil[1]);
- LOG_I(PHY, "In %s data 2 : rxF - > (%d,%d) (%d)\n",
- __FUNCTION__,
- rxF[2],
- rxF[3],
- dBc(rxF[2],rxF[3]));
-#endif
-
- multadd_real_vector_complex_scalar(fmm,
- ch,
- ul_ch,
- 8);
-
- //for (int i= 0; i<16; i++)
- //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
- ul_ch+=8;
-
- for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt += 2) {
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
- #ifdef DEBUG_PUSCH
- printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
- printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
- #endif
- multadd_real_vector_complex_scalar(fml,
- ch,
- ul_ch,
- 8);
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
- //printf("ul_ch addr %p\n",ul_ch);
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
- #ifdef DEBUG_PUSCH
- printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
- printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
- #endif
- multadd_real_vector_complex_scalar(fmm,
- ch,
- ul_ch,
- 8);
-
- //for (int i= 0; i<16; i++)
- //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
- ul_ch+=8;
+ if (pilot_cnt == 0) {
+ multadd_real_vector_complex_scalar(fl, ch, ul_ch, 8);
+ } else if (pilot_cnt == 1) {
+ multadd_real_vector_complex_scalar(fml, ch, ul_ch, 8);
+ } else if (pilot_cnt == (6*nb_rb_pusch-2)) {
+ multadd_real_vector_complex_scalar(fmr, ch, ul_ch, 8);
+ ul_ch+=8;
+ } else if (pilot_cnt == (6*nb_rb_pusch-1)) {
+ multadd_real_vector_complex_scalar(fr, ch, ul_ch, 8);
+ } else if (pilot_cnt%2 == 0) {
+ multadd_real_vector_complex_scalar(fmm, ch, ul_ch, 8);
+ ul_ch+=8;
+ } else {
+ multadd_real_vector_complex_scalar(fm, ch, ul_ch, 8);
+ }
+ pilot_cnt++;
+ }
}
-
- // Treat first 2 pilots specially (right edge)
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
- printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
- printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
- multadd_real_vector_complex_scalar(fm,
- ch,
- ul_ch,
- 8);
-
- //for (int i= 0; i<8; i++)
- //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
- printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
- printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
- printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
- multadd_real_vector_complex_scalar(fmr,
- ch,
- ul_ch,
- 8);
-
- pil += 2;
- re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
- ul_ch+=8;
-
- ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
- ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
- printf("pilot %u: rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
- printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+2,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
- multadd_real_vector_complex_scalar(fr,
- ch,
- ul_ch,
- 8);
-
// check if PRB crosses DC and improve estimates around DC
if ((bwp_start_subcarrier < gNB->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) {
ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
uint16_t idxPil = idxDC/2;
- re_offset = k;
+ re_offset = k0;
pil = (int16_t *)&pilot[0];
pil += (idxPil-2);
ul_ch += (idxDC-4);
@@ -428,10 +294,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
// for proper allignment of SIMD vectors
if((gNB->frame_parms.N_RB_UL&1)==0) {
- multadd_real_vector_complex_scalar(fdcl,
- ch,
- ul_ch-4,
- 8);
+ multadd_real_vector_complex_scalar(fdcl, ch, ul_ch-4, 8);
pil += 4;
re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size;
@@ -439,16 +302,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
- multadd_real_vector_complex_scalar(fdcr,
- ch,
- ul_ch-4,
- 8);
- }
- else {
- multadd_real_vector_complex_scalar(fdclh,
- ch,
- ul_ch,
- 8);
+ multadd_real_vector_complex_scalar(fdcr, ch, ul_ch-4, 8);
+
+ } else {
+
+ multadd_real_vector_complex_scalar(fdclh, ch, ul_ch, 8);
pil += 4;
re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size;
@@ -456,19 +314,18 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
- multadd_real_vector_complex_scalar(fdcrh,
- ch,
- ul_ch,
- 8);
+ multadd_real_vector_complex_scalar(fdcrh, ch, ul_ch, 8);
}
}
+
#ifdef DEBUG_PUSCH
ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
for(uint16_t idxP=0; idxP>15; // 1/12*16384
ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -880,6 +746,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
ul_ch,
8);
ul_ch -= 16;
+#endif
}
// Last PRB
ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
@@ -913,6 +780,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
ch[0] = ch_0 / 4;
ch[1] = ch_1 / 4;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+ ul_ch+=24;
+#else
ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -927,6 +798,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
ch,
ul_ch,
8);
+#endif
}
#ifdef DEBUG_PUSCH
ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
@@ -1033,7 +905,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
/*------------------------------------------------------------------------------------------------------- */
nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
rel15_ul->rnti,
- (int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch],
nr_tti_rx,
symbol,frame_parms->ofdm_symbol_size,
(int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index 2e270318f8..ca901e1452 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -295,74 +295,6 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
#define CHECK_DMRS_PBCH_SEQUENCE
-void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell)
-{
- uint32_t cinit;
- int i_ssb;
- int n_hf;
- int _i_ssb;
-
-#ifdef CHECK_DMRS_PBCH_SEQUENCE
-
- uint32_t dmrs_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE];
- uint32_t *dmrs_sequence = calloc(CELL_DMRS_LENGTH, sizeof(uint32_t));
- if (dmrs_sequence == NULL) {
- msg("Fatal error: memory allocation problem \n");
- assert(0);
- }
- else
- {
- printf("Check of demodulation reference signal of pbch sequence \n");
- }
-
-#endif
-
- /* for each slot number */
- for (i_ssb = 0; i_ssb>4) + 1))<<11) + ((_i_ssb + 1)<<6) + (Nid_cell%4);
-
- pseudo_random_sequence_optimised(DMRS_BITMAP_SIZE, &(dmrs_pbch_bitmap[i_ssb][n_hf][0]), cinit);
-
-#ifdef CHECK_DMRS_PBCH_SEQUENCE
-
- /* it allows checking generated with standard generation code */
- pseudo_random_sequence(DMRS_BITMAP_SIZE*sizeof(uint32_t), dmrs_sequence, cinit);
-
- int j = 0;
- int k = 0;
-
- /* format for getting bitmap from uint32_t */
- for (int i=0; iframe_parms;
- uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
- uint32_t x1, x2;
- uint8_t reset;
- int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1;
-
- for (uint8_t slot=0; slotslots_per_frame; slot++) {
- for (uint8_t symb=0; symbsymbols_per_slot; symb++) {
-
- reset = 1;
- x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
-
- for (uint32_t n=0; nN_RB_DL<<4)>>5)+1;
+ for (uint8_t slot=0; slotslots_per_frame; slot++) {
+ for (uint8_t symb=0; symbsymbols_per_slot; symb++) {
+ reset = 1;
+ x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
+ for (uint32_t n=0; nframe_parms;
- int32_t **txdataF = gNB->common_vars.txdataF;
- int txdataF_offset = slot*frame_parms.samples_per_slot_wCP;
- uint32_t **gold_csi_rs = gNB->nr_gold_csi_rs[slot];
+#ifdef NR_CSIRS_DEBUG
+ LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing);
+ LOG_I(NR_PHY, "csi_params->cyclic_prefix = %i\n", csi_params->cyclic_prefix);
+ LOG_I(NR_PHY, "csi_params->start_rb = %i\n", csi_params->start_rb);
+ LOG_I(NR_PHY, "csi_params->nr_of_rbs = %i\n", csi_params->nr_of_rbs);
+ LOG_I(NR_PHY, "csi_params->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csi_params->csi_type);
+ LOG_I(NR_PHY, "csi_params->row = %i\n", csi_params->row);
+ LOG_I(NR_PHY, "csi_params->freq_domain = %i\n", csi_params->freq_domain);
+ LOG_I(NR_PHY, "csi_params->symb_l0 = %i\n", csi_params->symb_l0);
+ LOG_I(NR_PHY, "csi_params->symb_l1 = %i\n", csi_params->symb_l1);
+ LOG_I(NR_PHY, "csi_params->cdm_type = %i\n", csi_params->cdm_type);
+ LOG_I(NR_PHY, "csi_params->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csi_params->freq_density);
+ LOG_I(NR_PHY, "csi_params->scramb_id = %i\n", csi_params->scramb_id);
+ LOG_I(NR_PHY, "csi_params->power_control_offset = %i\n", csi_params->power_control_offset);
+ LOG_I(NR_PHY, "csi_params->power_control_offset_ss = %i\n", csi_params->power_control_offset_ss);
+#endif
+
+ int dataF_offset = slot*frame_parms.samples_per_slot_wCP;
+ uint32_t **nr_gold_csi_rs = nr_csi_rs_info->nr_gold_csi_rs[slot];
//*8(max allocation per RB)*2(QPSK))
int csi_rs_length = frame_parms.N_RB_DL<<4;
- int16_t mod_csi[frame_parms.symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));;
- uint16_t b = csi_params.freq_domain;
- uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length;
+ int16_t mod_csi[frame_parms.symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));
+ uint16_t b = csi_params->freq_domain;
+ uint16_t n, p, k, l, mprime, na, kpn;
uint8_t size, ports, kprime, lprime, i, gs;
uint8_t j[16], k_n[6], koverline[16], loverline[16];
int found = 0;
@@ -48,16 +81,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
uint8_t fi = 0;
double rho, alpha;
uint32_t beta = amp;
+ nr_csi_rs_info->csi_rs_generated_signal_bits = log2_approx(amp);
AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n");
// if the scrambling id is not the one previously used to initialize we need to re-initialize the rs
- if (csi_params.scramb_id != gNB->csi_gold_init) {
- gNB->csi_gold_init = csi_params.scramb_id;
- nr_init_csi_rs(gNB, csi_params.scramb_id);
+ if (csi_params->scramb_id != nr_csi_rs_info->csi_gold_init) {
+ nr_csi_rs_info->csi_gold_init = csi_params->scramb_id;
+ nr_init_csi_rs(&frame_parms, nr_csi_rs_info->nr_gold_csi_rs, csi_params->scramb_id);
}
- switch (csi_params.row) {
+ switch (csi_params->row) {
// implementation of table 7.4.1.5.3-1 of 38.211
// lprime and kprime are the max value of l' and k'
case 1:
@@ -75,7 +109,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[0] + (i<<2);
}
break;
@@ -95,7 +129,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[0];
}
break;
@@ -115,7 +149,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[0];
}
break;
@@ -135,7 +169,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[0] + (i<<1);
}
break;
@@ -155,7 +189,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0 + i;
koverline[i] = k_n[0];
}
break;
@@ -174,7 +208,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -193,7 +227,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; i>1);
+ loverline[i] = csi_params->symb_l0 + (i>>1);
koverline[i] = k_n[i%2];
}
break;
@@ -212,7 +246,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -231,7 +265,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -250,7 +284,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -269,7 +303,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; i>2);
+ loverline[i] = csi_params->symb_l0 + (i>>2);
koverline[i] = k_n[i%4];
}
break;
@@ -288,7 +322,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -308,9 +342,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
for (i=0; isymb_l0 + i/3;
else
- loverline[i] = csi_params.symb_l1 + i/9;
+ loverline[i] = csi_params->symb_l1 + i/9;
koverline[i] = k_n[i%3];
}
break;
@@ -330,9 +364,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
for (i=0; isymb_l0;
else
- loverline[i] = csi_params.symb_l1;
+ loverline[i] = csi_params->symb_l1;
koverline[i] = k_n[i%3];
}
break;
@@ -351,7 +385,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
@@ -371,9 +405,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
for (i=0; i>2);
+ loverline[i] = csi_params->symb_l0 + (i>>2);
else
- loverline[i] = csi_params.symb_l1 + (i/12);
+ loverline[i] = csi_params->symb_l1 + (i/12);
koverline[i] = k_n[i%4];
}
break;
@@ -393,9 +427,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
for (i=0; isymb_l0;
else
- loverline[i] = csi_params.symb_l1;
+ loverline[i] = csi_params->symb_l1;
koverline[i] = k_n[i%4];
}
break;
@@ -414,17 +448,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (i=0; isymb_l0;
koverline[i] = k_n[i];
}
break;
default:
- AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params.row);
+ AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params->row);
}
#ifdef NR_CSIRS_DEBUG
- printf(" row %d, n. of ports %d\n k' ",csi_params.row,ports);
+ printf(" row %d, n. of ports %d\n k' ",csi_params->row,ports);
for (kp=0; kp<=kprime; kp++)
printf("%d, ",kp);
printf("l' ");
@@ -441,7 +475,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
// setting the frequency density from its index
- switch (csi_params.freq_density) {
+ switch (csi_params->freq_density) {
case 0:
rho = 0.5;
@@ -473,7 +507,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
#endif
// CDM group size from CDM type index
- switch (csi_params.cdm_type) {
+ switch (csi_params->cdm_type) {
case 0:
gs = 1;
@@ -495,39 +529,31 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
AssertFatal(0==1, "Invalid cdm type index for CSI\n");
}
- // according to 38.214 5.2.2.3.1 last paragraph
- if (csi_params.start_rb (csi_params.bwp_start+csi_params.bwp_size-csi_start))
- csi_bw = csi_params.bwp_start+csi_params.bwp_size-csi_start;
- else
- csi_bw = csi_params.nr_of_rbs;
-
+ uint16_t csi_length;
if (rho < 1) {
- if (csi_params.freq_density == 0)
- csi_length = (((csi_bw + csi_start)>>1)<>1)<freq_density == 0) {
+ csi_length = (((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<start_rb + csi_params->nr_of_rbs)>>1)<start_rb + csi_params->nr_of_rbs))<start_rb, csi_params->nr_of_rbs, csi_length);
#endif
// TRS
- if (csi_params.csi_type == 0) {
+ if (csi_params->csi_type == 0) {
// ???
}
// NZP CSI RS
- if (csi_params.csi_type == 1) {
+ if (csi_params->csi_type == 1) {
// assuming amp is the amplitude of SSB channels
- switch (csi_params.power_control_offset_ss) {
+ switch (csi_params->power_control_offset_ss) {
case 0:
beta = (amp*ONE_OVER_SQRT2_Q15)>>15;
break;
@@ -545,15 +571,15 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
}
for (lp=0; lp<=lprime; lp++){
- symb = csi_params.symb_l0;
- nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
- if ((csi_params.row == 5) || (csi_params.row == 7) || (csi_params.row == 11) || (csi_params.row == 13) || (csi_params.row == 16))
- nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
- if ((csi_params.row == 14) || (csi_params.row == 13) || (csi_params.row == 16) || (csi_params.row == 17)) {
- symb = csi_params.symb_l1;
- nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
- if ((csi_params.row == 13) || (csi_params.row == 16))
- nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
+ symb = csi_params->symb_l0;
+ nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+ if ((csi_params->row == 5) || (csi_params->row == 7) || (csi_params->row == 11) || (csi_params->row == 13) || (csi_params->row == 16))
+ nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
+ if ((csi_params->row == 14) || (csi_params->row == 13) || (csi_params->row == 16) || (csi_params->row == 17)) {
+ symb = csi_params->symb_l1;
+ nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+ if ((csi_params->row == 13) || (csi_params->row == 16))
+ nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
}
}
}
@@ -561,14 +587,14 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
uint16_t start_sc = frame_parms.first_carrier_offset;
// resource mapping according to 38.211 7.4.1.5.3
- for (n=csi_start; n<(csi_start+csi_bw); n++) {
- if ( (csi_params.freq_density > 1) || (csi_params.freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB
+ for (n=csi_params->start_rb; n<(csi_params->start_rb+csi_params->nr_of_rbs); n++) {
+ if ( (csi_params->freq_density > 1) || (csi_params->freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB
for (int ji=0; jicsi_type == 2) {
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0;
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0;
}
else {
- ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
- ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
}
#ifdef NR_CSIRS_DEBUG
- printf("l,k (%d %d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000,
- ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)],
- ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)]);
+ printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000,
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*dataF_offset)],
+ ((int16_t*)dataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)]);
#endif
}
}
- }
+ }
}
}
- }
+ }
+ nr_csi_rs_info->N_cdm_groups = size;
+ nr_csi_rs_info->CDM_group_size = gs;
+ nr_csi_rs_info->kprime = kprime;
+ nr_csi_rs_info->lprime = lprime;
+ nr_csi_rs_info->N_ports = ports;
+ memcpy(nr_csi_rs_info->j,j,16*sizeof(uint8_t));
+ memcpy(nr_csi_rs_info->koverline,koverline,16*sizeof(uint8_t));
+ memcpy(nr_csi_rs_info->loverline,loverline,16*sizeof(uint8_t));
+
+#ifdef NR_CSIRS_DEBUG
+ LOG_I(NR_PHY, "nr_csi_rs_info->N_ports = %d\n", nr_csi_rs_info->N_ports);
+ LOG_I(NR_PHY, "nr_csi_rs_info->N_cdm_groups = %d\n", nr_csi_rs_info->N_cdm_groups);
+ LOG_I(NR_PHY, "nr_csi_rs_info->CDM_group_size = %d\n", nr_csi_rs_info->CDM_group_size);
+ LOG_I(NR_PHY, "nr_csi_rs_info->kprime = %d\n", nr_csi_rs_info->kprime);
+ LOG_I(NR_PHY, "nr_csi_rs_info->lprime = %d\n", nr_csi_rs_info->lprime);
+ for(int ji=0; jiN_cdm_groups; ji++) {
+ LOG_I(NR_PHY, "(CDM group %d) j = %d, koverline = %d, loverline = %d\n", ji, nr_csi_rs_info->j[ji], nr_csi_rs_info->koverline[ji], nr_csi_rs_info->loverline[ji]);
+ }
+#endif
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index d975c1d38b..45125c8db4 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -214,6 +214,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
#endif
stop_meas(&gNB->dlsch_layer_mapping_stats);
+
/// Resource mapping
// Non interleaved VRB to PRB mapping
@@ -235,6 +236,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
for (int nl=0; nlnrOfLayers; nl++) {
int dmrs_port = get_dmrs_port(nl,rel15->dmrsPorts);
+
// DMRS params for this dmrs port
get_Wt(Wt, dmrs_port, dmrs_Type);
get_Wf(Wf, dmrs_port, dmrs_Type);
@@ -312,7 +314,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
for (int i=0; irbSize*NR_NB_SC_PER_RB; i++) {
/* check if cuurent RE is PTRS RE*/
is_ptrs_re = 0;
- if (ptrs_symbol)
+ /* check for PTRS symbol and set flag for PTRS RE */
+ if(ptrs_symbol){
is_ptrs_re = is_ptrs_subcarrier(k,
rel15->rnti,
nl,
@@ -322,6 +325,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
rel15->PTRSReOffset,
start_sc,
frame_parms->ofdm_symbol_size);
+ }
/* Map DMRS Symbol */
if ( (dmrs_symbol_map & (1 << l)) &&
(k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
@@ -337,6 +341,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
k_prime&=1;
n+=(k_prime)?0:1;
}
+ /* Map PTRS Symbol */
else if(is_ptrs_re){
txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index daa4ed1723..bdf681c21d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -49,11 +49,6 @@ void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type);
void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list);
-
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
-
void nr_pdsch_codeword_scrambling(uint8_t *in,
uint32_t size,
uint8_t q,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 84ea27fb9c..548cc6dbd4 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -306,12 +306,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
unsigned int crc=1;
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
impp.Zc = &harq->Z;
- float Coderate = 0.0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
uint32_t A = rel15->TBSize[0]<<3;
unsigned char *a=harq->pdu;
if ( rel15->rnti != SI_RNTI)
- trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
+ trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
NR_gNB_SCH_STATS_t *stats=NULL;
int first_free=-1;
@@ -369,10 +368,9 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc
}
- if (rel15->targetCodeRate[0]<1000)
- Coderate = (float)rel15->targetCodeRate[0] /(float) 1024;
- else // to scale for mcs 20 and 26 in table 5.1.3.1-2 which are decimal and input 2* in nr_tbs_tools
- Coderate = (float)rel15->targetCodeRate[0] /(float) 2048;
+ // target_code_rate is in 0.1 units
+ float Coderate = (float) rel15->targetCodeRate[0] / 10240.0f;
+ LOG_D(PHY,"DLSCH Coderate %f\n",Coderate);
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
impp.BG = 2;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index b12a58526d..eb012532ce 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -175,11 +175,19 @@ void rx_nr_prach_ru(RU_t *ru,
int msg1_frequencystart = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value;
int sample_offset_slot;
- if (!(slot%(fp->slots_per_subframe/2)))
- sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
- else
- sample_offset_slot = (prachStartSymbol==0?0:prachStartSymbol*(fp->ofdm_symbol_size+fp->nb_prefix_samples));
- //to be checked for mu=0;
+ if (prachStartSymbol == 0) {
+ sample_offset_slot = 0;
+ } else if (fp->slots_per_subframe == 1) {
+ if (prachStartSymbol <= 7)
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+ else
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
+ } else {
+ if (!(slot%(fp->slots_per_subframe/2)))
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+ else
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+ }
LOG_D(PHY,"frame %d, slot %d: doing rx_nr_prach_ru for format %d, numRA %d, prachStartSymbol %d, prachOccasion %d\n",frame,slot,prachFormat,numRA,prachStartSymbol,prachOccasion);
@@ -193,89 +201,167 @@ void rx_nr_prach_ru(RU_t *ru,
prach[aa] = (int16_t*)&ru->common.rxdata[aa][fp->get_samples_slot_timestamp(slot2,fp,0)+sample_offset_slot-ru->N_TA_offset];
}
- idft_size_idx_t dftsize;
- int dftlen=0;
+ int reps;
+ int Ncp;
+ int dftlen;
int mu = fp->numerology_index;
- int Ncp = 0;
- int16_t *prach2;
if (prach_sequence_length == 0) {
LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d, msg1_frequencyStart %d\n",
ru->idx,frame,slot2,prachFormat,msg1_frequencystart);
- AssertFatal(prachFormat<4,"Illegal prach format %d for length 839\n",prachFormat);
switch (prachFormat) {
case 0:
+ reps = 1;
Ncp = 3168;
+ dftlen = 24576;
break;
-
+
case 1:
+ reps = 2;
Ncp = 21024;
+ dftlen = 24576;
break;
-
+
case 2:
+ reps = 4;
Ncp = 4688;
+ dftlen = 24576;
break;
-
+
case 3:
+ reps = 4;
Ncp = 3168;
+ dftlen = 6144;
+ break;
+
+ default:
+ AssertFatal(1==0, "Illegal prach format %d for length 839\n", prachFormat);
break;
-
}
}
else {
LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s, msg1_frequencyStart %d,startSymbol %d\n",
ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol);
-
switch (prachFormat) {
case 4: //A1
- Ncp = 288/(1<> mu;
break;
-
+
case 5: //A2
- Ncp = 576/(1<> mu;
break;
-
+
case 6: //A3
- Ncp = 864/(1<> mu;
break;
-
+
case 7: //B1
- Ncp = 216/(1<> mu;
+ break;
+
/*
// B2 and B3 do not exist in FAPI
case 4: //B2
- Ncp = 360/(1<> mu;
break;
-
+
case 5: //B3
- Ncp = 504/(1<> mu;
break;
*/
+
case 8: //B4
- Ncp = 936/(1<> mu;
break;
-
+
case 9: //C0
- Ncp = 1240/(1<> mu;
break;
-
+
case 10: //C2
- Ncp = 2048/(1<> mu;
break;
-
+
default:
AssertFatal(1==0,"unknown prach format %x\n",prachFormat);
break;
}
+ dftlen = 2048 >> mu;
}
+
+ //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
+ if(fp->numerology_index == 0) {
+ if (prachStartSymbol == 0 || prachStartSymbol == 7)
+ Ncp += 16;
+ }
+ else {
+ if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
+ Ncp += 16;
+ }
+
+ switch(fp->samples_per_subframe) {
+ case 7680:
+ // 5 MHz @ 7.68 Ms/s
+ Ncp >>= 2;
+ dftlen >>= 2;
+ break;
+
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
+ Ncp >>= 1;
+ dftlen >>= 1;
+ break;
+
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ Ncp = Ncp;
+ dftlen = dftlen;
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
+ Ncp = (Ncp*3)/2;
+ dftlen = (dftlen*3)/2;
+ break;
+
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ Ncp <<= 1;
+ dftlen <<= 1;
+ break;
+
+ case 92160:
+ // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+ Ncp *= 3;
+ dftlen *= 3;
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+ Ncp <<= 2;
+ dftlen <<= 2;
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+ }
+
+ const idft_size_idx_t dftsize = get_dft(dftlen);
+
// Do forward transform
if (LOG_DEBUGFLAG(PRACH)) {
- LOG_D(PHY,"rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d\n",ru->nb_rx, Ncp);
+ LOG_D(PHY, "rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d dftlen:%d\n", ru->nb_rx, Ncp, dftlen);
}
-
// Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
int kbar = 1;
@@ -299,357 +385,13 @@ void rx_nr_prach_ru(RU_t *ru,
k*=K;
k+=kbar;
- int reps=1;
-
for (int aa=0; aanb_rx; aa++) {
AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa);
// do DFT
- if (mu==1) {
- switch(fp->samples_per_subframe) {
- case 15360:
- // 10, 15 MHz @ 15.36 Ms/s
- prach2 = prach[aa] + (1*Ncp); // Ncp is for 30.72 Ms/s, so divide by 2 to bring to 15.36 Ms/s and multiply by 2 for I/Q
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=12288;
- dft(DFT_12288,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_12288,prach2+(24576*2),rxsigF[aa]+(24576*2),1);
- dft(DFT_12288,prach2+(24576*3),rxsigF[aa]+(24576*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=3072;
- for (int i=0;i<4;i++) dft(DFT_3072,prach2+(i*3072*2),rxsigF[aa]+(i*3072*2),1);
- reps=4;
- }
- } else { // 839 sequence
- if (prachStartSymbol == 0) prach2+=16; // 8 samples @ 15.36 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=512;
- dft(DFT_512,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_512,prach2+1024,rxsigF[aa]+1024,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_512,prach2+1024*2,rxsigF[aa]+1024*2,1);
- dft(DFT_512,prach2+1024*3,rxsigF[aa]+1024*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_512,prach2+1024*4,rxsigF[aa]+1024*4,1);
- dft(DFT_512,prach2+1024*5,rxsigF[aa]+1024*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_512,prach2+(1024*i),rxsigF[aa]+(1024*i),1);
- reps+=6;
- }
- }
- break;
-
- case 30720:
- // 20, 25, 30 MHz @ 30.72 Ms/s
- prach2 = prach[aa] + (2*Ncp); // Ncp is for 30.72 Ms/s, so just multiply by 2 for I/Q
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=24576;
- dft(DFT_24576,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_24576,prach2+(49152*2),rxsigF[aa]+(49152*2),1);
- dft(DFT_24576,prach2+(49152*3),rxsigF[aa]+(49152*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=6144;
- for (int i=0;i<4;i++) dft(DFT_6144,prach2+(i*6144*2),rxsigF[aa]+(i*6144*2),1);
- reps=4;
- }
- } else { // 839 sequence
- if (prachStartSymbol == 0) prach2+=32; // 16 samples @ 30.72 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=1024;
- dft(DFT_1024,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_1024,prach2+2048,rxsigF[aa]+2048,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_1024,prach2+2048*2,rxsigF[aa]+2048*2,1);
- dft(DFT_1024,prach2+2048*3,rxsigF[aa]+2048*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_1024,prach2+2048*4,rxsigF[aa]+2048*4,1);
- dft(DFT_1024,prach2+2048*5,rxsigF[aa]+2048*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_1024,prach2+(2048*i),rxsigF[aa]+(2048*i),1);
- reps+=6;
- }
- }
- break;
-
- case 61440:
- // 40, 50, 60 MHz @ 61.44 Ms/s
- prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=49152;
- dft(DFT_49152,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
- dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=12288;
- for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
- reps=4;
- }
- } else { // 839 sequence
- if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=2048;
- dft(DFT_2048,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
- dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
- dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
- reps+=6;
- }
- }
- break;
-
- case 46080:
- // 40 MHz @ 46.08 Ms/s
- prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=36864;
- dft(DFT_36864,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
- dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=9216;
- for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
- reps=4;
- }
- } else { // 839 sequence
- if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=1536;
- dft(DFT_1536,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
- dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
- dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
- reps+=6;
- }
- }
- break;
-
- case 122880:
- // 70, 80, 90, 100 MHz @ 122.88 Ms/s
- prach2 = prach[aa] + (8*Ncp);
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=98304;
- dft(DFT_98304,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
- dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=24576;
- for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
- reps=4;
- }
- } else { // 839 sequence
- if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=4096;
- dft(DFT_4096,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
- dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
- dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
- reps+=6;
- }
- }
- break;
-
- case 92160:
- // 80, 90 MHz @ 92.16 Ms/s
- prach2 = prach[aa] + (6*Ncp);
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=73728;
- dft(DFT_73728,prach2,rxsigF[aa],1);
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1);
- dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=18432;
- for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
- reps=4;
- }
- } else {
- if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
- dftlen=3072;
- dft(DFT_3072,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
- dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
- dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
- reps+=6;
- }
- }
- break;
- default:
- AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0);
- }
- }
- else if (mu==3) {
- if (fp->threequarter_fs) {
- AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
- }
- if (prach_sequence_length == 0) {
- AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
- }
- if (fp->N_RB_UL == 32) {
- prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 for 61.44Msps
- if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe
- dftlen=512;
- dftsize = DFT_512;
- }
- else if (fp->N_RB_UL == 66) {
- prach2 = prach[aa] + (Ncp<<3); // Ncp is for 30.72 Ms/s, so multiply by 4 for I/Q, and 2 for 122.88Msps
- if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe
- dftlen=1024;
- dftsize = DFT_1024;
- }
- else {
- AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
- }
-
- dft(dftsize,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(dftsize,prach2+dftlen*2,rxsigF[aa]+dftlen*2,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(dftsize,prach2+dftlen*4,rxsigF[aa]+dftlen*4,1);
- dft(dftsize,prach2+dftlen*6,rxsigF[aa]+dftlen*6,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(dftsize,prach2+dftlen*8,rxsigF[aa]+dftlen*8,1);
- dft(dftsize,prach2+dftlen*10,rxsigF[aa]+dftlen*10,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++)
- dft(dftsize,prach2+(dftlen*2*i),rxsigF[aa]+(dftlen*2*i),1);
- reps+=6;
- }
- }
- else {
- AssertFatal(1==0,"Numerology not supported\n");
- }
+ int16_t *prach2 = prach[aa] + (2*Ncp); // times 2 for complex samples
+ for (int i = 0; i < reps; i++)
+ dft(dftsize, prach2 + 2*dftlen*i, rxsigF[aa] + 2*dftlen*i, 1);
//LOG_M("ru_rxsigF_tmp.m","rxsFtmp", rxsigF[aa], dftlen*2*reps, 1, 1);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
index 4bbecfd994..8a49a7ffe0 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
@@ -52,6 +52,7 @@ void nr_codeword_scrambling(uint8_t *in,
((uint16_t*)&in32)[0] = _mm_movemask_epi8(_mm_slli_epi16(in128[0],7));
((uint16_t*)&in32)[1] = _mm_movemask_epi8(_mm_slli_epi16(in128[1],7));
out[i]=(in32^s);
+ LOG_D(PHY,"in[%d] %x => %x\n",i,in32,out[i]);
s=lte_gold_generic(&x1, &x2, 0);
}
//#elsif defined(__arm__) || defined(__aarch64)
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
index 2daf2af1fb..74d19bf6f6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
@@ -60,14 +60,6 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint
uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r);
-uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
-
-uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
-
void compute_nr_prach_seq(uint8_t short_sequence,
uint8_t num_sequences,
uint8_t rootSequenceIndex,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index 9b24504a14..e3b7efacfb 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -136,21 +136,22 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
@param nb_rb_pusch The number of RBs allocated (used for Resource Allocation Type 1 in NR)
@param frame_parms, Pointer to frame descriptor structure
*/
-void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
- NR_gNB_PUSCH *pusch_vars,
- int slot,
- unsigned char symbol,
- uint8_t is_dmrs_symbol,
- nfapi_nr_pusch_pdu_t *pusch_pdu,
- NR_DL_FRAME_PARMS *frame_parms);
+void nr_ulsch_extract_rbs(int32_t **rxdataF,
+ NR_gNB_PUSCH *pusch_vars,
+ int slot,
+ unsigned char symbol,
+ uint8_t is_dmrs_symbol,
+ nfapi_nr_pusch_pdu_t *pusch_pdu,
+ NR_DL_FRAME_PARMS *frame_parms);
void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
NR_gNB_ULSCH_t *ulsch_gNB,
- uint8_t symbol,
- uint8_t start_symbol,
- uint16_t nb_rb,
- pusch_dmrs_type_t pusch_dmrs_type);
+ uint8_t symbol,
+ uint8_t is_dmrs_symbol,
+ uint32_t len,
+ uint8_t nrOfLayers,
+ uint16_t nb_rb);
/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
@param ul_ch_estimates_ext Channel estimates in allocated RBs
@@ -184,9 +185,10 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
int **ul_ch_mag,
int **ul_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
NR_DL_FRAME_PARMS *frame_parms,
unsigned char symbol,
+ int length,
uint8_t is_dmrs_symbol,
unsigned char mod_order,
uint8_t nrOfLayers,
@@ -254,8 +256,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
@param mod_order modulation order
*/
void nr_ulsch_compute_llr(int32_t *rxdataF_comp,
- int32_t **ul_ch_mag,
- int32_t **ul_ch_magb,
+ int32_t *ul_ch_mag,
+ int32_t *ul_ch_magb,
int16_t *ulsch_llr,
uint32_t nb_rb,
uint32_t nb_re,
@@ -335,9 +337,11 @@ void init_prach_ru_list(RU_t *ru);
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
uint8_t get_nr_prach_duration(uint8_t prach_format);
-void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
+void nr_generate_csi_rs(NR_DL_FRAME_PARMS frame_parms,
+ int32_t **dataF,
int16_t amp,
- nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params,
+ nr_csi_rs_info_t *nr_csi_rs_info,
+ nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
int slot);
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
index 3e3137739e..5c6839366c 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
@@ -85,6 +85,33 @@ void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n
nr_codeword_unscrambling(llr, size, 0, Nid, n_RNTI);
}
+void nr_ulsch_layer_demapping(int16_t *llr_cw,
+ uint8_t Nl,
+ uint8_t mod_order,
+ uint32_t length,
+ int16_t **llr_layers)
+{
+
+ switch (Nl) {
+ case 1:
+ memcpy((void*)llr_cw, (void*)llr_layers[0], (length)*sizeof(int16_t));
+ break;
+ case 2:
+ case 3:
+ case 4:
+ for (int i=0; i<(length/Nl/mod_order); i++) {
+ for (int l=0; lnumber_of_nr_ulsch_max;i++) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
index 0791fd2bbc..c7229bc5d0 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
@@ -71,6 +71,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n_RNTI);
+void nr_ulsch_layer_demapping(int16_t *llr_cw,
+ uint8_t Nl,
+ uint8_t mod_order,
+ uint32_t length,
+ int16_t **llr_layers);
+
void nr_ulsch_procedures(PHY_VARS_gNB *gNB,
int frame_rx,
int slot_rx,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index b4e1034fb6..b9a1430be6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -57,8 +57,7 @@
void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
{
- int i,r;
- uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated
+ uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated
NR_gNB_ULSCH_t *ulsch = *ulschptr;
if (N_RB_UL != 273) {
@@ -66,17 +65,18 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
a_segments = a_segments/273 +1;
}
- for (i=0; iharq_processes[i]) {
if (ulsch->harq_processes[i]->b) {
free_and_zero(ulsch->harq_processes[i]->b);
ulsch->harq_processes[i]->b = NULL;
}
- for (r=0; rharq_processes[i]->c[r]);
free_and_zero(ulsch->harq_processes[i]->d[r]);
- free_and_zero(ulsch->harq_processes[i]->w[r]);
}
+ free_and_zero(ulsch->harq_processes[i]->c);
+ free_and_zero(ulsch->harq_processes[i]->d);
free_and_zero(ulsch->harq_processes[i]);
ulsch->harq_processes[i] = NULL;
}
@@ -90,7 +90,7 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
NR_gNB_ULSCH_t *ulsch;
uint8_t i,r;
- uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated
+ uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated
if (N_RB_UL != 273) {
a_segments = a_segments*N_RB_UL;
@@ -107,10 +107,11 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
ulsch->harq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t));
ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes);
+ ulsch->harq_processes[i]->c = (uint8_t**)malloc16_clear(a_segments*sizeof(uint8_t *));
+ ulsch->harq_processes[i]->d = (int16_t**)malloc16_clear(a_segments*sizeof(int16_t *));
for (r=0; rharq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t));
ulsch->harq_processes[i]->d[r] = (int16_t*)malloc16_clear((68*384)*sizeof(int16_t));
- ulsch->harq_processes[i]->w[r] = (int16_t*)malloc16_clear((3*(6144+64))*sizeof(int16_t));
}
}
@@ -168,8 +169,6 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
ulsch->harq_processes[i]->C=0;
/// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
//int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
- /// LDPC processing buffer
- //t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS];
ulsch->harq_processes[i]->Z=0;
/// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
//int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448];
@@ -259,9 +258,12 @@ void nr_processULSegment(void* arg) {
//////////////////////////// ulsch_llr =====> ulsch_harq->e //////////////////////////////
+ /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
+ int16_t harq_e[3*8448];
+
nr_deinterleaving_ldpc(E,
Qm,
- ulsch_harq->e[r],
+ harq_e,
ulsch_llr+r_offset);
//for (int i =0; i<16; i++)
@@ -270,16 +272,7 @@ void nr_processULSegment(void* arg) {
stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
- /*LOG_D(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,
- ulsch_harq->TBS,
- Qm,
- nb_rb,
- n_layers,
- pusch_pdu->pusch_data.rv_index,
- ulsch_harq->round);*/
- //////////////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
@@ -294,7 +287,7 @@ void nr_processULSegment(void* arg) {
p_decoderParms->BG,
p_decoderParms->Z,
ulsch_harq->d[r],
- ulsch_harq->e[r],
+ harq_e,
ulsch_harq->C,
rv_index,
ulsch_harq->new_rx,
@@ -357,13 +350,13 @@ void nr_processULSegment(void* arg) {
if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) {
#ifdef PRINT_CRC_CHECK
- LOG_I(PHY, "Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations);
+ LOG_I(PHY,"Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations);
#endif
rdata->decodeIterations = no_iteration_ldpc;
if (rdata->decodeIterations > p_decoderParms->numMaxIter) rdata->decodeIterations--;
} else {
#ifdef PRINT_CRC_CHECK
- LOG_I(PHY, "CRC NOK\n");
+ LOG_I(PHY,"CRC NOK\n");
#endif
rdata->decodeIterations = max_ldpc_iterations + 1;
}
@@ -414,13 +407,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
phy_vars_gNB->nbDecode = 0;
harq_process->processedSegments = 0;
-
- double Coderate = 0.0;
// ------------------------------------------------------------------
uint16_t nb_rb = pusch_pdu->rb_size;
uint8_t Qm = pusch_pdu->qam_mod_order;
- uint16_t R = pusch_pdu->target_code_rate;
uint8_t mcs = pusch_pdu->mcs_index;
uint8_t n_layers = pusch_pdu->nrOfLayers;
// ------------------------------------------------------------------
@@ -449,13 +439,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
A = (harq_process->TBS)<<3;
- LOG_D(NR_PHY, "ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d, Coderate %d\n", harq_pid, A, G, mcs, n_layers, nb_rb, Qm, n_layers, R);
+ // target_code_rate is in 0.1 units
+ float Coderate = (float) pusch_pdu->target_code_rate / 10240.0f;
+
+ LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, Coderate %f RV %d round %d\n",
+ harq_pid, A, G, mcs, n_layers, nb_rb, Qm, Coderate, pusch_pdu->pusch_data.rv_index, harq_process->round);
- if (R<1024)
- Coderate = (float) R /(float) 1024;
- else
- Coderate = (float) R /(float) 2048;
-
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
p_decParams->BG = 2;
kc = 52;
@@ -543,7 +532,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
r_offset = 0;
- uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated
+ uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*n_layers; //number of segments to be allocated
if (nb_rb != 273) {
a_segments = a_segments*nb_rb;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 44f4dd8bfc..260bfbdfbc 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -302,36 +302,32 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH)
}
-void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
- NR_gNB_PUSCH *pusch_vars,
- int slot,
- unsigned char symbol,
- uint8_t is_dmrs_symbol,
- nfapi_nr_pusch_pdu_t *pusch_pdu,
- NR_DL_FRAME_PARMS *frame_parms)
-{
+void nr_ulsch_extract_rbs(int32_t **rxdataF,
+ NR_gNB_PUSCH *pusch_vars,
+ int slot,
+ unsigned char symbol,
+ uint8_t is_dmrs_symbol,
+ nfapi_nr_pusch_pdu_t *pusch_pdu,
+ NR_DL_FRAME_PARMS *frame_parms) {
unsigned short start_re, re, nb_re_pusch;
- unsigned char aarx;
+ unsigned char aarx, aatx;
uint32_t rxF_ext_index = 0;
uint32_t ul_ch0_ext_index = 0;
uint32_t ul_ch0_index = 0;
- uint8_t k_prime;
- uint16_t n;
int16_t *rxF,*rxF_ext;
int *ul_ch0,*ul_ch0_ext;
- uint8_t delta = 0;
int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size;
-#ifdef DEBUG_RB_EXT
+#ifdef DEBUG_RB_EXT
printf("--------------------symbol = %d-----------------------\n", symbol);
printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size);
-
#endif
- uint8_t is_dmrs_re;
+ uint8_t is_data_re;
start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start + pusch_pdu->bwp_start) * NR_NB_SC_PER_RB)%frame_parms->ofdm_symbol_size;
nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size;
+
#ifdef __AVX2__
int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
#else
@@ -340,62 +336,64 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
- rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)];
- rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
-
- ul_ch0 = &pusch_vars->ul_ch_estimates[aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
-
- ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aarx][symbol*nb_re_pusch2];
-
- n = 0;
- k_prime = 0;
- rxF_ext_index = 0;
- ul_ch0_ext_index = 0;
- ul_ch0_index = 0;
-
+ rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)];
+ rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
+
if (is_dmrs_symbol == 0) {
- //
- //rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
if (start_re + nb_re_pusch <= frame_parms->ofdm_symbol_size) {
- memcpy1((void*)rxF_ext,
- (void*)&rxF[start_re*2],
- nb_re_pusch*sizeof(int32_t));
+ memcpy1((void*)rxF_ext, (void*)&rxF[start_re*2], nb_re_pusch*sizeof(int32_t));
} else {
- int neg_length = frame_parms->ofdm_symbol_size-start_re;
- int pos_length = nb_re_pusch-neg_length;
-
- memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t));
- memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t));
+ int neg_length = frame_parms->ofdm_symbol_size-start_re;
+ int pos_length = nb_re_pusch-neg_length;
+ memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t));
+ memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t));
}
- memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t));
- }
- else {
- for (re = 0; re < nb_re_pusch; re++) {
- is_dmrs_re = (re == get_dmrs_freq_idx_ul(n, k_prime, delta, pusch_pdu->dmrs_config_type));
+ for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) {
+ ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
+ ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2];
+ memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t));
+ }
-#ifdef DEBUG_RB_EXT
- printf("re = %d, kprime %d, n %d, is_dmrs_symbol = %d, symbol = %d\n", re, k_prime, n, is_dmrs_symbol, symbol);
-#endif
+ } else {
- /* save only data and respective channel estimates */
- if (is_dmrs_re == 0) {
- rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
- rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
- ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
+ for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) {
+ ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
+ ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2];
-#ifdef DEBUG_RB_EXT
- printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n",
+ rxF_ext_index = 0;
+ ul_ch0_ext_index = 0;
+ ul_ch0_index = 0;
+ for (re = 0; re < nb_re_pusch; re++) {
+ uint16_t k = start_re + re;
+ is_data_re = allowed_xlsch_re_in_dmrs_symbol(k, start_re, frame_parms->ofdm_symbol_size, pusch_pdu->num_dmrs_cdm_grps_no_data, pusch_pdu->dmrs_config_type);
+ if (++k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+
+ #ifdef DEBUG_RB_EXT
+ printf("re = %d, is_dmrs_symbol = %d, symbol = %d\n", re, is_dmrs_symbol, symbol);
+ #endif
+
+ // save only data and respective channel estimates
+ if (is_data_re == 1) {
+ if (aatx == 0) {
+ rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]);
+ rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
+ rxF_ext_index +=2;
+ }
+
+ ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
+ ul_ch0_ext_index++;
+
+ #ifdef DEBUG_RB_EXT
+ printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n",
is_dmrs_symbol,rxF_ext_index>>1, rxF_ext[rxF_ext_index],rxF_ext[rxF_ext_index+1],
ul_ch0_ext_index, ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[0], ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[1]);
-#endif
- ul_ch0_ext_index++;
- rxF_ext_index +=2;
- } else {
- n += k_prime;
- k_prime ^= 1;
+ #endif
+ }
+ ul_ch0_index++;
}
- ul_ch0_index++;
}
}
}
@@ -406,16 +404,19 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
NR_gNB_ULSCH_t *ulsch_gNB,
uint8_t symbol,
uint8_t is_dmrs_symbol,
- unsigned short nb_rb,
- pusch_dmrs_type_t pusch_dmrs_type)
+ uint32_t len,
+ uint8_t nrOfLayers,
+ unsigned short nb_rb)
{
#if defined(__x86_64__)||defined(__i386__)
short rb, ch_amp;
- unsigned char aarx;
+ unsigned char aarx,aatx;
__m128i *ul_ch128, ch_amp128;
+ uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
+
// Determine scaling amplitude based the symbol
ch_amp = 1024*8; //((pilots) ? (ulsch_gNB->sqrt_rho_b) : (ulsch_gNB->sqrt_rho_a));
@@ -431,35 +432,22 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
-
- ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
-
- if (is_dmrs_symbol==1){
- if (pusch_dmrs_type == pusch_dmrs_type1)
- nb_rb = nb_rb>>1;
- else
- nb_rb = (2*nb_rb)/3;
- }
-
- for (rb=0;rbnb_antennas_rx; aarx++) {
+ ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
+ for (rb=0;rb < nb_rb_0;rb++) {
ul_ch128[0] = _mm_mulhi_epi16(ul_ch128[0], ch_amp128);
ul_ch128[0] = _mm_slli_epi16(ul_ch128[0], 3);
ul_ch128[1] = _mm_mulhi_epi16(ul_ch128[1], ch_amp128);
ul_ch128[1] = _mm_slli_epi16(ul_ch128[1], 3);
- if (is_dmrs_symbol) {
- ul_ch128+=2;
- } else {
- ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128);
- ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3);
- ul_ch128+=3;
-
- }
+ ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128);
+ ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3);
+ ul_ch128+=3;
}
}
+ }
#endif
}
@@ -481,6 +469,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int16_t x = factor2(len);
int16_t y = (len)>>x;
+
+ uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
#ifdef __AVX2__
int off = ((nb_rb&1) == 1)? 4:0;
@@ -488,14 +478,14 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aatx = 0; aatx < nrOfLayers; aatx++)
+ for (aatx = 0; aatx < nrOfLayers; aatx++) {
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
//clear average level
avg128U = _mm_setzero_si128();
ul_ch128=(__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
- for (rb = 0; rb < len/12; rb++) {
+ for (rb = 0; rb < nb_rb_0; rb++) {
avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));
avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x));
avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x));
@@ -506,8 +496,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
((int32_t*)&avg128U)[1] +
((int32_t*)&avg128U)[2] +
((int32_t*)&avg128U)[3]) / y;
-
}
+ }
_mm_empty();
_m_empty();
@@ -520,7 +510,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int16x4_t *ul_ch128;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
+ uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
for (aatx=0; aatxnb_antennas_rx; aarx++) {
//clear average level
@@ -529,7 +519,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
- for (rb = 0; rb < nb_rb; rb++) {
+ for (rb = 0; rb < nb_rb_0; rb++) {
// printf("rb %d : ",rb);
// print_shorts("ch",&ul_ch128[0]);
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[0], ul_ch128[0]));
@@ -568,14 +558,20 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
#endif
}
+
+
+//==============================================================================================
+// Pre-processing for LLR computation
+//==============================================================================================
void nr_ulsch_channel_compensation(int **rxdataF_ext,
int **ul_ch_estimates_ext,
int **ul_ch_mag,
int **ul_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
NR_DL_FRAME_PARMS *frame_parms,
unsigned char symbol,
+ int length,
uint8_t is_dmrs_symbol,
unsigned char mod_order,
uint8_t nrOfLayers,
@@ -591,22 +587,21 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
#ifdef DEBUG_CH_COMP
int16_t *rxF, *ul_ch;
int prnt_idx;
+ for (int nl=0; nlnb_antennas_rx; aarx++) {
+ rxF = (int16_t *) &rxdataF_ext[aarx][symbol * (off + (nb_rb * 12))];
+ ul_ch = (int16_t *) &ul_ch_estimates_ext[nl * frame_parms->nb_antennas_rx + aarx][symbol * (off + (nb_rb * 12))];
- for (int ant=0; antnb_antennas_rx; ant++) {
- rxF = (int16_t *)&rxdataF_ext[ant][symbol*(off+(nb_rb*12))];
- ul_ch = (int16_t *)&ul_ch_estimates_ext[ant][symbol*(off+(nb_rb*12))];
-
- printf("--------------------symbol = %d, mod_order = %d, output_shift = %d-----------------------\n", symbol, mod_order, output_shift);
- printf("----------------Before compensation------------------\n");
-
- for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
-
- printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
- printf("ul_ch[%d] = (%d,%d)\n", prnt_idx>>1, ul_ch[prnt_idx],ul_ch[prnt_idx+1]);
+ printf("--------symbol = %d, mod_order = %d, output_shift = %d, layer %i, antenna rx = %d -----------\n",
+ symbol, mod_order, output_shift, nl, aarx);
+ printf("----------------Before compensation------------------\n");
+ for (prnt_idx = 0; prnt_idx < 12 * 5 * 2; prnt_idx += 2) {
+ printf("rxF[%d] = (%d,%d)\n", prnt_idx >> 1, rxF[prnt_idx], rxF[prnt_idx + 1]);
+ printf("ul_ch[%d] = (%d,%d)\n", prnt_idx >> 1, ul_ch[prnt_idx], ul_ch[prnt_idx + 1]);
+ }
}
}
-
#endif
#ifdef DEBUG_CH_MAG
@@ -637,20 +632,20 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
QAM_amp128b = _mm_setzero_si128();
+ uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
for (aatx=0; aatxnb_antennas_rx; aarx++) {
-
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
ul_ch_mag128 = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
ul_ch_mag128b = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
@@ -658,7 +653,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
- for (rb=0; rb2) {
// get channel amplitude if not QPSK
@@ -679,6 +674,8 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
ul_ch_mag128[0] = _mm_mulhi_epi16(ul_ch_mag128[0],QAM_amp128);
ul_ch_mag128[0] = _mm_slli_epi16(ul_ch_mag128[0],1);
+ ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b);
+ ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1);
// print_ints("ch: = ",(int32_t*)&mmtmpD0);
// print_shorts("QAM_amp:",(int16_t*)&QAM_amp128);
// print_shorts("mag:",(int16_t*)&ul_ch_mag128[0]);
@@ -687,30 +684,24 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
ul_ch_mag128b[1] = ul_ch_mag128[1];
ul_ch_mag128[1] = _mm_mulhi_epi16(ul_ch_mag128[1],QAM_amp128);
ul_ch_mag128[1] = _mm_slli_epi16(ul_ch_mag128[1],1);
-
- if (is_dmrs_symbol==0) {
- mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
-
- ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
- ul_ch_mag128b[2] = ul_ch_mag128[2];
-
- ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128);
- ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1);
- }
-
- ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b);
- ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1);
-
-
+
ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b);
ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1);
- if (is_dmrs_symbol==0) {
- ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b);
- ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1);
- }
+ mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
+
+ ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
+ ul_ch_mag128b[2] = ul_ch_mag128[2];
+
+ ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128);
+ ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1);
+
+
+ ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b);
+ ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1);
+
}
// multiply by conjugated channel
@@ -755,117 +746,153 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
// print_shorts("ch:",ul_ch128+1);
// print_shorts("pack:",rxdataF_comp128+1);
- if (is_dmrs_symbol==0) {
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+ // multiply by conjugated channel
+ mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]);
+ // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+ mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+ mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
+ // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+ mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",ul_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
-
- ul_ch128+=3;
- ul_ch_mag128+=3;
- ul_ch_mag128b+=3;
- rxdataF128+=3;
- rxdataF_comp128+=3;
- } else { // we have a smaller PUSCH in symbols with pilots so skip last group of 4 REs and increment less
- ul_ch128+=2;
- ul_ch_mag128+=2;
- ul_ch_mag128b+=2;
- rxdataF128+=2;
- rxdataF_comp128+=2;
- }
+ rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ //print_shorts("rx:",rxdataF128+2);
+ //print_shorts("ch:",ul_ch128+2);
+ //print_shorts("pack:",rxdataF_comp128+2);
+ ul_ch128+=3;
+ ul_ch_mag128+=3;
+ ul_ch_mag128b+=3;
+ rxdataF128+=3;
+ rxdataF_comp128+=3;
}
}
}
if (rho) {
+ //we compute the Tx correlation matrix for each Rx antenna
+ //As an example the 2x2 MIMO case requires
+ //rho[aarx][nb_aatx*nb_aatx] = [cov(H_aarx_0,H_aarx_0) cov(H_aarx_0,H_aarx_1)
+ // cov(H_aarx_1,H_aarx_0) cov(H_aarx_1,H_aarx_1)], aarx=0,...,nb_antennas_rx-1
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- rho128 = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_UL*12];
- ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_UL*12];
- ul_ch128_2 = (__m128i *)&ul_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_UL*12];
+ int avg_rho_re[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers];
+ int avg_rho_im[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers];
- for (rb=0; rbnb_antennas_rx; aarx++) {
+ for (aatx=0; aatx < nrOfLayers; aatx++) {
+ for (int atx=0; atx< nrOfLayers; atx++) {
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[0]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
- rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ avg_rho_re[aarx][aatx*nrOfLayers+atx] = 0;
+ avg_rho_im[aarx][aatx*nrOfLayers+atx] = 0;
+ rho128 = (__m128i *)&rho[aarx][aatx*nrOfLayers+atx][symbol*(off+(nb_rb*12))];
+ ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
+ ul_ch128_2 = (__m128i *)&ul_ch_estimates_ext[atx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
- //print_shorts("rx:",ul_ch128_2);
- //print_shorts("ch:",ul_ch128);
- //print_shorts("pack:",rho128);
+ for (rb=0; rbrx_correlation[0][0][aarx] = signal_energy(&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12],rb*12);
+ avg_rho_re[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_re[aarx][aatx*nrOfLayers+atx]/(nb_rb*12);
+ avg_rho_im[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_im[aarx][aatx*nrOfLayers+atx]/(nb_rb*12);
+ //printf("rho[rx]%d tx%d tx%d = Re: %d Im: %d\n",aarx, aatx,atx, avg_rho_re[aarx][aatx*nb_aatx+atx], avg_rho_im[aarx][aatx*nb_aatx+atx]);
+ }
+ }
}
-
}
}
@@ -1070,19 +1097,17 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
#ifdef DEBUG_CH_COMP
+ for (int nl2=0; nl2nb_antennas_rx; aarx2++) {
+ rxF = (int16_t *)&rxdataF_comp[nl2*frame_parms->nb_antennas_rx+aarx2][(symbol*(off+(nb_rb*12)))];
- for (int ant=0; antnb_antennas_rx; ant++) {
- rxF = (int16_t *)&rxdataF_comp[ant][(symbol*(off+(nb_rb*12)))];
-
- printf("----------------After compansation------------------\n");
-
- for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
-
- printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
+ printf("--------After compansation, layer %i, antenna rx %i----------\n", nl2, aarx2);
+ for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
+ printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
+ }
}
}
-
#endif
#ifdef DEBUG_CH_MAG
@@ -1105,19 +1130,23 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
}
void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **ul_ch_mag,
- int32_t **ul_ch_magb,
- uint8_t symbol,
- uint16_t nb_rb) {
+ int32_t **rxdataF_comp,
+ int32_t **ul_ch_mag,
+ int32_t **ul_ch_magb,
+ int32_t ***rho,
+ uint8_t nrOfLayers,
+ uint8_t symbol,
+ uint16_t nb_rb,
+ int length) {
int n_rx = frame_parms->nb_antennas_rx;
#if defined(__x86_64__) || defined(__i386__)
- __m128i *rxdataF_comp128[1+n_rx],*ul_ch_mag128[1+n_rx],*ul_ch_mag128b[1+n_rx];
+ __m128i *rxdataF_comp128[2],*ul_ch_mag128[2],*ul_ch_mag128b[2];
#elif defined(__arm__)
int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b;
int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b;
#endif
int32_t i;
+ uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
#ifdef __AVX2__
int off = ((nb_rb&1) == 1)? 4:0;
@@ -1125,23 +1154,30 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
int off = 0;
#endif
- if (frame_parms->nb_antennas_rx>1) {
-#if defined(__x86_64__) || defined(__i386__)
- int nb_re = nb_rb*12;
- for (int aa=0;aanb_antennas_rx;aa++) {
- rxdataF_comp128[aa] = (__m128i *)&rxdataF_comp[aa][(symbol*(nb_re + off))];
- ul_ch_mag128[aa] = (__m128i *)&ul_ch_mag[aa][(symbol*(nb_re + off))];
- ul_ch_mag128b[aa] = (__m128i *)&ul_ch_magb[aa][(symbol*(nb_re + off))];
- }
- for (int aa=1;aanb_antennas_rx;aa++) {
- // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
- for (i=0; i 1) {
+ #if defined(__x86_64__) || defined(__i386__)
+ for (int aatx=0; aatxnb_antennas_rx][(symbol*(nb_re + off))];
+ ul_ch_mag128[0] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))];
+ ul_ch_mag128b[0] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))];
+
+ for (int aa=1;aa < n_rx;aa++) {
+ rxdataF_comp128[1] = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+ ul_ch_mag128[1] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+ ul_ch_mag128b[1] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+
+ // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
+ for (i=0; iN_RB_DL*12];
rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_0 = (int16x8_t *)&ul_ch_mag[0][symbol*frame_parms->N_RB_DL*12];
@@ -1156,7 +1192,7 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
ul_ch_mag128_0b[i] = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]);
rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t *)&jitterc[0]));
}
-#endif
+ #endif
}
#if defined(__x86_64__) || defined(__i386__)
@@ -1165,6 +1201,696 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
#endif
}
+/* Zero Forcing Rx function: nr_det_HhH()
+ *
+ *
+ * */
+void nr_ulsch_det_HhH(int32_t *after_mf_00,//a
+ int32_t *after_mf_01,//b
+ int32_t *after_mf_10,//c
+ int32_t *after_mf_11,//d
+ int32_t *det_fin,//1/ad-bc
+ unsigned short nb_rb,
+ unsigned char symbol,
+ int32_t shift)
+{
+ int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+ unsigned short rb;
+ __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128; //ad_im_128, bc_im_128;
+ __m128i *det_fin_128, det_re_128; //det_im_128, tmp_det0, tmp_det1;
+
+ after_mf_00_128 = (__m128i *)after_mf_00;
+ after_mf_01_128 = (__m128i *)after_mf_01;
+ after_mf_10_128 = (__m128i *)after_mf_10;
+ after_mf_11_128 = (__m128i *)after_mf_11;
+
+ det_fin_128 = (__m128i *)det_fin;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ //complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d)
+ //The imag part is often zero, we compute only the real part
+ ad_re_128 = _mm_sign_epi16(after_mf_00_128[0],*(__m128i*)&nr_conjug2[0]);
+ ad_re_128 = _mm_madd_epi16(ad_re_128,after_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1
+ //ad_im_128 = _mm_shufflelo_epi16(after_mf_00_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ //ad_im_128 = _mm_shufflehi_epi16(ad_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ //ad_im_128 = _mm_madd_epi16(ad_im_128,after_mf_11_128[0]);//Im: (Q_aI_d + I_aQ_d)
+
+ //complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c)
+ //The imag part is often zero, we compute only the real part
+ bc_re_128 = _mm_sign_epi16(after_mf_01_128[0],*(__m128i*)&nr_conjug2[0]);
+ bc_re_128 = _mm_madd_epi16(bc_re_128,after_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1
+ //bc_im_128 = _mm_shufflelo_epi16(after_mf_01_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits
+ //bc_im_128 = _mm_shufflehi_epi16(bc_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits
+ //bc_im_128 = _mm_madd_epi16(bc_im_128,after_mf_10_128[0]);//Im: (Q_bI_c + I_bQ_c)
+
+ det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
+ //det_im_128 = _mm_sub_epi32(ad_im_128, bc_im_128);
+
+ //det in Q30 format
+ det_fin_128[0] = _mm_abs_epi32(det_re_128);
+
+
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("\n Computing det_HhH_inv \n");
+ //print_ints("det_re_128:",(int32_t*)&det_re_128);
+ //print_ints("det_im_128:",(int32_t*)&det_im_128);
+ print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]);
+#endif
+ det_fin_128+=1;
+ after_mf_00_128+=1;
+ after_mf_01_128+=1;
+ after_mf_10_128+=1;
+ after_mf_11_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+/* Zero Forcing Rx function: nr_inv_comp_muli
+ * Complex number multi: z = x*y
+ * = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+ * */
+__m128i nr_ulsch_inv_comp_muli(__m128i input_x,
+ __m128i input_y)
+{
+ int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
+ __m128i xy_re_128, xy_im_128;
+ __m128i output_z, tmp_z0, tmp_z1;
+
+ // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+
+ // the real part
+ xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]);
+ xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im)
+
+ // the imag part
+ xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im)
+
+ //convert back to Q15 before packing
+ xy_re_128 = _mm_srai_epi32(xy_re_128,4);//(2^15/64*2*16)
+ xy_im_128 = _mm_srai_epi32(xy_im_128,4);
+
+ tmp_z0 = _mm_unpacklo_epi32(xy_re_128,xy_im_128);
+ //print_ints("unpack lo:",&tmp_z0[0]);
+ tmp_z1 = _mm_unpackhi_epi32(xy_re_128,xy_im_128);
+ //print_ints("unpack hi:",&tmp_z1[0]);
+ output_z = _mm_packs_epi32(tmp_z0,tmp_z1);
+
+ _mm_empty();
+ _m_empty();
+ return(output_z);
+}
+
+/* Zero Forcing Rx function: nr_conjch0_mult_ch1()
+ *
+ *
+ * */
+void nr_ulsch_conjch0_mult_ch1(int *ch0,
+ int *ch1,
+ int32_t *ch0conj_ch1,
+ unsigned short nb_rb,
+ unsigned char output_shift0)
+{
+ //This function is used to compute multiplications in H_hermitian * H matrix
+ short nr_conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+ unsigned short rb;
+ __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+
+ dl_ch0_128 = (__m128i *)ch0;
+ dl_ch1_128 = (__m128i *)ch1;
+
+ ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
+ mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&nr_conjugate[0]);
+ mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
+ mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+ mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+
+ ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+
+ /*printf("\n Computing conjugates \n");
+ print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]);
+ print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]);
+ print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);*/
+
+ dl_ch0_128+=1;
+ dl_ch1_128+=1;
+ ch0conj_ch1_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+__m128i nr_ulsch_comp_muli_sum(__m128i input_x,
+ __m128i input_y,
+ __m128i input_w,
+ __m128i input_z,
+ __m128i det)
+{
+ int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
+ __m128i xy_re_128, xy_im_128, wz_re_128, wz_im_128;
+ __m128i output, tmp_z0, tmp_z1;
+
+ // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+ // the real part
+ xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]);
+ xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im)
+
+ // the imag part
+ xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im)
+
+ // complex multiplication (w_re + jw_im)*(z_re + jz_im) = (w_re*z_re - w_im*z_im) + j(w_im*z_re + w_re*z_im)
+ // the real part
+ wz_re_128 = _mm_sign_epi16(input_w,*(__m128i*)&nr_conjug2[0]);
+ wz_re_128 = _mm_madd_epi16(wz_re_128,input_z); //Re: (w_re*z_re - w_im*z_im)
+
+ // the imag part
+ wz_im_128 = _mm_shufflelo_epi16(input_w,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ wz_im_128 = _mm_shufflehi_epi16(wz_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+ wz_im_128 = _mm_madd_epi16(wz_im_128,input_z);//Im: (w_im*z_re + w_re*z_im)
+
+
+ xy_re_128 = _mm_sub_epi32(xy_re_128, wz_re_128);
+ xy_im_128 = _mm_sub_epi32(xy_im_128, wz_im_128);
+ //print_ints("rx_re:",(int32_t*)&xy_re_128[0]);
+ //print_ints("rx_Img:",(int32_t*)&xy_im_128[0]);
+ //divide by matrix det and convert back to Q15 before packing
+ int sum_det =0;
+ for (int k=0; k<4;k++) {
+ sum_det += ((((int *)&det[0])[k])>>2);
+ //printf("det_%d = %d log2 =%d \n",k,(((int *)&det[0])[k]),log2_approx(((int *)&det[0])[k]));
+ }
+
+ xy_re_128 = _mm_slli_epi32(xy_re_128,5);
+ xy_re_128 = _mm_srai_epi32(xy_re_128,log2_approx(sum_det));
+ xy_re_128 = _mm_slli_epi32(xy_re_128,5);
+
+ xy_im_128 = _mm_slli_epi32(xy_im_128,5);
+ xy_im_128 = _mm_srai_epi32(xy_im_128,log2_approx(sum_det));
+ xy_im_128 = _mm_slli_epi32(xy_im_128,5);
+
+ tmp_z0 = _mm_unpacklo_epi32(xy_re_128,xy_im_128);
+ //print_ints("unpack lo:",&tmp_z0[0]);
+ tmp_z1 = _mm_unpackhi_epi32(xy_re_128,xy_im_128);
+ //print_ints("unpack hi:",&tmp_z1[0]);
+ output = _mm_packs_epi32(tmp_z0,tmp_z1);
+
+ _mm_empty();
+ _m_empty();
+ return(output);
+}
+/* Zero Forcing Rx function: nr_construct_HhH_elements()
+ *
+ *
+ * */
+void nr_ulsch_construct_HhH_elements(int *conjch00_ch00,
+ int *conjch01_ch01,
+ int *conjch11_ch11,
+ int *conjch10_ch10,//
+ int *conjch20_ch20,
+ int *conjch21_ch21,
+ int *conjch30_ch30,
+ int *conjch31_ch31,
+ int *conjch00_ch01,//00_01
+ int *conjch01_ch00,//01_00
+ int *conjch10_ch11,//10_11
+ int *conjch11_ch10,//11_10
+ int *conjch20_ch21,
+ int *conjch21_ch20,
+ int *conjch30_ch31,
+ int *conjch31_ch30,
+ int32_t *after_mf_00,
+ int32_t *after_mf_01,
+ int32_t *after_mf_10,
+ int32_t *after_mf_11,
+ unsigned short nb_rb,
+ unsigned char symbol)
+{
+ //This function is used to construct the (H_hermitian * H matrix) matrix elements
+ unsigned short rb;
+ __m128i *conjch00_ch00_128, *conjch01_ch01_128, *conjch11_ch11_128, *conjch10_ch10_128;
+ __m128i *conjch20_ch20_128, *conjch21_ch21_128, *conjch30_ch30_128, *conjch31_ch31_128;
+ __m128i *conjch00_ch01_128, *conjch01_ch00_128, *conjch10_ch11_128, *conjch11_ch10_128;
+ __m128i *conjch20_ch21_128, *conjch21_ch20_128, *conjch30_ch31_128, *conjch31_ch30_128;
+ __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
+
+ conjch00_ch00_128 = (__m128i *)conjch00_ch00;
+ conjch01_ch01_128 = (__m128i *)conjch01_ch01;
+ conjch11_ch11_128 = (__m128i *)conjch11_ch11;
+ conjch10_ch10_128 = (__m128i *)conjch10_ch10;
+
+ conjch20_ch20_128 = (__m128i *)conjch20_ch20;
+ conjch21_ch21_128 = (__m128i *)conjch21_ch21;
+ conjch30_ch30_128 = (__m128i *)conjch30_ch30;
+ conjch31_ch31_128 = (__m128i *)conjch31_ch31;
+
+ conjch00_ch01_128 = (__m128i *)conjch00_ch01;
+ conjch01_ch00_128 = (__m128i *)conjch01_ch00;
+ conjch10_ch11_128 = (__m128i *)conjch10_ch11;
+ conjch11_ch10_128 = (__m128i *)conjch11_ch10;
+
+ conjch20_ch21_128 = (__m128i *)conjch20_ch21;
+ conjch21_ch20_128 = (__m128i *)conjch21_ch20;
+ conjch30_ch31_128 = (__m128i *)conjch30_ch31;
+ conjch31_ch30_128 = (__m128i *)conjch31_ch30;
+
+ after_mf_00_128 = (__m128i *)after_mf_00;
+ after_mf_01_128 = (__m128i *)after_mf_01;
+ after_mf_10_128 = (__m128i *)after_mf_10;
+ after_mf_11_128 = (__m128i *)after_mf_11;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ after_mf_00_128[0] =_mm_adds_epi16(conjch00_ch00_128[0],conjch10_ch10_128[0]);//00_00 + 10_10
+ if (conjch20_ch20 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch20_ch20_128[0]);
+ if (conjch30_ch30 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch30_ch30_128[0]);
+
+ after_mf_11_128[0] =_mm_adds_epi16(conjch01_ch01_128[0], conjch11_ch11_128[0]); //01_01 + 11_11
+ if (conjch21_ch21 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch21_ch21_128[0]);
+ if (conjch31_ch31 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch31_ch31_128[0]);
+
+ after_mf_01_128[0] =_mm_adds_epi16(conjch00_ch01_128[0], conjch10_ch11_128[0]);//00_01 + 10_11
+ if (conjch20_ch21 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch20_ch21_128[0]);
+ if (conjch30_ch31 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch30_ch31_128[0]);
+
+ after_mf_10_128[0] =_mm_adds_epi16(conjch01_ch00_128[0], conjch11_ch10_128[0]);//01_00 + 11_10
+ if (conjch21_ch20 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch21_ch20_128[0]);
+ if (conjch31_ch30 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch31_ch30_128[0]);
+
+#ifdef DEBUG_DLSCH_DEMOD
+ if ((rb<=30))
+ {
+ printf(" \n construct_HhH_elements \n");
+ print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+ print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+ print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+ print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+ }
+#endif
+ conjch00_ch00_128+=1;
+ conjch10_ch10_128+=1;
+ conjch01_ch01_128+=1;
+ conjch11_ch11_128+=1;
+
+ if (conjch20_ch20 != NULL) conjch20_ch20_128+=1;
+ if (conjch21_ch21 != NULL) conjch21_ch21_128+=1;
+ if (conjch30_ch30 != NULL) conjch30_ch30_128+=1;
+ if (conjch31_ch31 != NULL) conjch31_ch31_128+=1;
+
+ conjch00_ch01_128+=1;
+ conjch01_ch00_128+=1;
+ conjch10_ch11_128+=1;
+ conjch11_ch10_128+=1;
+
+ if (conjch20_ch21 != NULL) conjch20_ch21_128+=1;
+ if (conjch21_ch20 != NULL) conjch21_ch20_128+=1;
+ if (conjch30_ch31 != NULL) conjch30_ch31_128+=1;
+ if (conjch31_ch30 != NULL) conjch31_ch30_128+=1;
+
+ after_mf_00_128 += 1;
+ after_mf_01_128 += 1;
+ after_mf_10_128 += 1;
+ after_mf_11_128 += 1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+/* Zero Forcing Rx function: nr_ulsch_zero_forcing_rx_2layers()
+ *
+ *
+ * */
+uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
+ int **ul_ch_mag,
+ int **ul_ch_magb,
+ int **ul_ch_estimates_ext,
+ unsigned short nb_rb,
+ unsigned char n_rx,
+ unsigned char mod_order,
+ int shift,
+ unsigned char symbol,
+ int length)
+{
+ int *ch00, *ch01, *ch10, *ch11;
+ int *ch20, *ch30, *ch21, *ch31;
+ uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
+
+ #ifdef __AVX2__
+ int off = ((nb_rb&1) == 1)? 4:0;
+ #else
+ int off = 0;
+ #endif
+
+ /* we need at least alignment to 16 bytes, let's put 32 to be sure
+ * (maybe not necessary but doesn't hurt)
+ */
+ int32_t conjch00_ch01[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch01_ch00[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch10_ch11[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch11_ch10[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch00_ch00[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch01_ch01[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch10_ch10[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch11_ch11[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch20_ch20[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch21_ch21[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch30_ch30[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch31_ch31[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch20_ch21[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch30_ch31[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch21_ch20[12*nb_rb] __attribute__((aligned(32)));
+ int32_t conjch31_ch30[12*nb_rb] __attribute__((aligned(32)));
+
+ int32_t af_mf_00[12*nb_rb] __attribute__((aligned(32)));
+ int32_t af_mf_01[12*nb_rb] __attribute__((aligned(32)));
+ int32_t af_mf_10[12*nb_rb] __attribute__((aligned(32)));
+ int32_t af_mf_11[12*nb_rb] __attribute__((aligned(32)));
+ int32_t determ_fin[12*nb_rb] __attribute__((aligned(32)));
+
+ switch (n_rx) {
+ case 2://
+ ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)];
+ ch01 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)];
+ ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)];
+ ch11 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)];
+ ch20 = NULL;
+ ch21 = NULL;
+ ch30 = NULL;
+ ch31 = NULL;
+ break;
+
+ case 4://
+ ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)];
+ ch01 = (int *)&ul_ch_estimates_ext[4][symbol*(off+nb_rb*12)];
+ ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)];
+ ch11 = (int *)&ul_ch_estimates_ext[5][symbol*(off+nb_rb*12)];
+ ch20 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)];
+ ch21 = (int *)&ul_ch_estimates_ext[6][symbol*(off+nb_rb*12)];
+ ch30 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)];
+ ch31 = (int *)&ul_ch_estimates_ext[7][symbol*(off+nb_rb*12)];
+ break;
+
+ default:
+ return -1;
+ break;
+ }
+
+ /* 1- Compute the rx channel matrix after compensation: (1/2^log2_max)x(H_herm x H)
+ * for n_rx = 2
+ * |conj_H_00 conj_H_10| | H_00 H_01| |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)|
+ * | | x | | = | |
+ * |conj_H_01 conj_H_11| | H_10 H_11| |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)|
+ *
+ */
+
+ if (n_rx>=2){
+ // (1/2^log2_maxh)*conj_H_00xH_00: (1/(64*2))conjH_00*H_00*2^15
+ nr_ulsch_conjch0_mult_ch1(ch00,
+ ch00,
+ conjch00_ch00,
+ nb_rb_0,
+ shift);
+ // (1/2^log2_maxh)*conj_H_10xH_10: (1/(64*2))conjH_10*H_10*2^15
+ nr_ulsch_conjch0_mult_ch1(ch10,
+ ch10,
+ conjch10_ch10,
+ nb_rb_0,
+ shift);
+ // conj_H_00xH_01
+ nr_ulsch_conjch0_mult_ch1(ch00,
+ ch01,
+ conjch00_ch01,
+ nb_rb_0,
+ shift); // this shift is equal to the channel level log2_maxh
+ // conj_H_10xH_11
+ nr_ulsch_conjch0_mult_ch1(ch10,
+ ch11,
+ conjch10_ch11,
+ nb_rb_0,
+ shift);
+ // conj_H_01xH_01
+ nr_ulsch_conjch0_mult_ch1(ch01,
+ ch01,
+ conjch01_ch01,
+ nb_rb_0,
+ shift);
+ // conj_H_11xH_11
+ nr_ulsch_conjch0_mult_ch1(ch11,
+ ch11,
+ conjch11_ch11,
+ nb_rb_0,
+ shift);
+ // conj_H_01xH_00
+ nr_ulsch_conjch0_mult_ch1(ch01,
+ ch00,
+ conjch01_ch00,
+ nb_rb_0,
+ shift);
+ // conj_H_11xH_10
+ nr_ulsch_conjch0_mult_ch1(ch11,
+ ch10,
+ conjch11_ch10,
+ nb_rb_0,
+ shift);
+ }
+ if (n_rx==4){
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2*16))conjH_20*H_20*2^15
+ nr_ulsch_conjch0_mult_ch1(ch20,
+ ch20,
+ conjch20_ch20,
+ nb_rb_0,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_30xH_30: (1/(64*2*4))conjH_30*H_30*2^15
+ nr_ulsch_conjch0_mult_ch1(ch30,
+ ch30,
+ conjch30_ch30,
+ nb_rb_0,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_ulsch_conjch0_mult_ch1(ch20,
+ ch21,
+ conjch20_ch21,
+ nb_rb_0,
+ shift);
+
+ nr_ulsch_conjch0_mult_ch1(ch30,
+ ch31,
+ conjch30_ch31,
+ nb_rb_0,
+ shift);
+
+ nr_ulsch_conjch0_mult_ch1(ch21,
+ ch21,
+ conjch21_ch21,
+ nb_rb_0,
+ shift);
+
+ nr_ulsch_conjch0_mult_ch1(ch31,
+ ch31,
+ conjch31_ch31,
+ nb_rb_0,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_ulsch_conjch0_mult_ch1(ch21,
+ ch20,
+ conjch21_ch20,
+ nb_rb_0,
+ shift);
+
+ nr_ulsch_conjch0_mult_ch1(ch31,
+ ch30,
+ conjch31_ch30,
+ nb_rb_0,
+ shift);
+
+ nr_ulsch_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ conjch20_ch20,
+ conjch21_ch21,
+ conjch30_ch30,
+ conjch31_ch31,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ conjch20_ch21,
+ conjch21_ch20,
+ conjch30_ch31,
+ conjch31_ch30,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb_0,
+ symbol);
+ }
+ if (n_rx==2){
+ nr_ulsch_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb_0,
+ symbol);
+ }
+ //det_HhH = ad -bc
+ nr_ulsch_det_HhH(af_mf_00,//a
+ af_mf_01,//b
+ af_mf_10,//c
+ af_mf_11,//d
+ determ_fin,
+ nb_rb_0,
+ symbol,
+ shift);
+ /* 2- Compute the channel matrix inversion **********************************
+ *
+ * |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)|
+ * A= | |
+ * |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)|
+ *
+ *
+ *
+ *inv(A) =(1/det)*[d -b
+ * -c a]
+ *
+ *
+ **************************************************************************/
+ __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*ul_ch_mag128_0=NULL,*ul_ch_mag128b_0=NULL,*determ_fin_128;//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1
+ __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+ __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
+ __m128i QAM_amp128={0},QAM_amp128b={0};
+
+ determ_fin_128 = (__m128i *)&determ_fin[0];
+
+ rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[0][symbol*(off+nb_rb*12)];//aatx=0 @ aarx =0
+ rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[n_rx][symbol*(off+nb_rb*12)];//aatx=1 @ aarx =0
+
+ after_mf_a_128 = (__m128i *)af_mf_00;
+ after_mf_b_128 = (__m128i *)af_mf_01;
+ after_mf_c_128 = (__m128i *)af_mf_10;
+ after_mf_d_128 = (__m128i *)af_mf_11;
+
+ if (mod_order>2) {
+ if (mod_order == 4) {
+ QAM_amp128 = _mm_set1_epi16(QAM16_n1); //2/sqrt(10)
+ QAM_amp128b = _mm_setzero_si128();
+ } else if (mod_order == 6) {
+ QAM_amp128 = _mm_set1_epi16(QAM64_n1); //4/sqrt{42}
+ QAM_amp128b = _mm_set1_epi16(QAM64_n2); //2/sqrt{42}
+ }
+ ul_ch_mag128_0 = (__m128i *)&ul_ch_mag[0][symbol*(off+nb_rb*12)];
+ ul_ch_mag128b_0 = (__m128i *)&ul_ch_magb[0][symbol*(off+nb_rb*12)];
+ }
+
+ for (int rb=0; rb<3*nb_rb_0; rb++) {
+ if (mod_order>2) {
+ int sum_det =0;
+ for (int k=0; k<4;k++) {
+ sum_det += ((((int *)&determ_fin_128[0])[k])>>2);
+ //printf("det_%d = %d\n",k,sum_det);
+ }
+
+ mmtmpD2 = _mm_slli_epi32(determ_fin_128[0],5);
+ mmtmpD2 = _mm_srai_epi32(mmtmpD2,log2_approx(sum_det));
+ mmtmpD2 = _mm_slli_epi32(mmtmpD2,5);
+
+ mmtmpD3 = _mm_unpacklo_epi32(mmtmpD2,mmtmpD2);
+
+ mmtmpD2 = _mm_unpackhi_epi32(mmtmpD2,mmtmpD2);
+
+ mmtmpD2 = _mm_packs_epi32(mmtmpD3,mmtmpD2);
+
+ ul_ch_mag128_0[0] = mmtmpD2;
+ ul_ch_mag128b_0[0] = mmtmpD2;
+
+ ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0],QAM_amp128);
+ ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0],1);
+
+ ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0],QAM_amp128b);
+ ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0],1);
+
+ //print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]);
+ //print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]);
+ //print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]);
+ //print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]);
+ //print_shorts("magr layer 1:",(int16_t*)&dl_ch_mag128r_0[0]);
+ //print_shorts("magr layer 2:",(int16_t*)&dl_ch_mag128r_1[0]);
+ }
+ // multiply by channel Inv
+ //rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
+ //rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
+ //printf("layer_1 \n");
+ mmtmpD0 = nr_ulsch_comp_muli_sum(rxdataF_comp128_0[0],
+ after_mf_d_128[0],
+ rxdataF_comp128_1[0],
+ after_mf_b_128[0],
+ determ_fin_128[0]);
+
+ //printf("layer_2 \n");
+ mmtmpD1 = nr_ulsch_comp_muli_sum(rxdataF_comp128_1[0],
+ after_mf_a_128[0],
+ rxdataF_comp128_0[0],
+ after_mf_c_128[0],
+ determ_fin_128[0]);
+
+ rxdataF_comp128_0[0] = mmtmpD0;
+ rxdataF_comp128_1[0] = mmtmpD1;
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("\n Rx signal after ZF l%d rb%d\n",symbol,rb);
+ print_shorts(" Rx layer 1:",(int16_t*)&rxdataF_comp128_0[0]);
+ print_shorts(" Rx layer 2:",(int16_t*)&rxdataF_comp128_1[0]);
+#endif
+ determ_fin_128 += 1;
+ ul_ch_mag128_0 += 1;
+ ul_ch_mag128b_0 += 1;
+ rxdataF_comp128_0 += 1;
+ rxdataF_comp128_1 += 1;
+ after_mf_a_128 += 1;
+ after_mf_b_128 += 1;
+ after_mf_c_128 += 1;
+ after_mf_d_128 += 1;
+ }
+ _mm_empty();
+ _m_empty();
+ return(0);
+}
+
+//==============================================================================================
+
+/* Main Function */
int nr_rx_pusch(PHY_VARS_gNB *gNB,
uint8_t ulsch_id,
uint32_t frame,
@@ -1186,7 +1912,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start)*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos);
-
+ LOG_D(PHY,"ulsch RX %x : start_rb %d nb_rb %d mcs %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_ports %d\n",
+ rel15_ul->rnti,rel15_ul->rb_start,rel15_ul->rb_size,rel15_ul->mcs_index,
+ rel15_ul->nrOfLayers,0,rel15_ul->bwp_start,0,rel15_ul->start_symbol_index,rel15_ul->nr_of_symbols,
+ rel15_ul->num_dmrs_cdm_grps_no_data,rel15_ul->ul_dmrs_symb_pos,rel15_ul->dmrs_ports);
//----------------------------------------------------------
//--------------------- Channel estimation ---------------------
//----------------------------------------------------------
@@ -1194,11 +1923,13 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag);
+
if (dmrs_symbol_flag == 1) {
if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE)
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
- for (int nl=0; nlnrOfLayers; nl++)
+ for (int nl=0; nlnrOfLayers; nl++) {
+
nr_pusch_channel_estimation(gNB,
slot,
get_dmrs_port(nl,rel15_ul->dmrs_ports),
@@ -1206,6 +1937,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
ulsch_id,
bwp_start_subcarrier,
rel15_ul);
+ }
nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol,rel15_ul->nrOfLayers);
@@ -1214,9 +1946,11 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = 0;
gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] = 0;
}
- gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc(
- &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol * frame_parms->ofdm_symbol_size],
+ for (aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) {
+ gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc(
+ &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aatx*gNB->frame_parms.nb_antennas_rx+aarx][symbol * frame_parms->ofdm_symbol_size],
rel15_ul->rb_size * 12);
+ }
for (int rb = 0; rb < rel15_ul->rb_size; rb++) {
gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] +=
gNB->measurements.n0_subband_power[aarx][rel15_ul->bwp_start + rel15_ul->rb_start + rb] /
@@ -1254,7 +1988,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
else {
nb_re_pusch = rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4));
}
- } else {
+ }
+ else {
nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
}
@@ -1265,15 +2000,14 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
//--------------------- RBs extraction ---------------------
//----------------------------------------------------------
if (nb_re_pusch > 0) {
-
start_meas(&gNB->ulsch_rbs_extraction_stats);
- nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF,
- gNB->pusch_vars[ulsch_id],
- slot,
- symbol,
- dmrs_symbol_flag,
- rel15_ul,
- frame_parms);
+ nr_ulsch_extract_rbs(gNB->common_vars.rxdataF,
+ gNB->pusch_vars[ulsch_id],
+ slot,
+ symbol,
+ dmrs_symbol_flag,
+ rel15_ul,
+ frame_parms);
stop_meas(&gNB->ulsch_rbs_extraction_stats);
//----------------------------------------------------------
@@ -1284,8 +2018,9 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB->ulsch[ulsch_id],
symbol,
dmrs_symbol_flag,
- rel15_ul->rb_size,
- rel15_ul->dmrs_config_type);
+ nb_re_pusch,
+ rel15_ul->nrOfLayers,
+ rel15_ul->rb_size);
if (gNB->pusch_vars[ulsch_id]->cl_done==0) {
nr_ulsch_channel_level(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
@@ -1319,6 +2054,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
(rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
frame_parms,
symbol,
+ nb_re_pusch,
dmrs_symbol_flag,
rel15_ul->qam_mod_order,
rel15_ul->nrOfLayers,
@@ -1331,19 +2067,32 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
+ (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
+ rel15_ul->nrOfLayers,
symbol,
- rel15_ul->rb_size);
+ rel15_ul->rb_size,
+ nb_re_pusch);
+
+ if (rel15_ul->nrOfLayers == 2)//Apply zero forcing for 2 Tx layers
+ nr_ulsch_zero_forcing_rx_2layers(gNB->pusch_vars[ulsch_id]->rxdataF_comp,
+ gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
+ gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
+ gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
+ rel15_ul->rb_size,
+ frame_parms->nb_antennas_rx,
+ rel15_ul->qam_mod_order,
+ gNB->pusch_vars[ulsch_id]->log2_maxh,
+ symbol,
+ nb_re_pusch);
stop_meas(&gNB->ulsch_mrc_stats);
- // transform precoding = 0 means enabled
- if (rel15_ul->transform_precoding == 0) {
-
- #ifdef __AVX2__
+ if (rel15_ul->transform_precoding == transformPrecoder_enabled) {
+ #ifdef __AVX2__
// For odd number of resource blocks need byte alignment to multiple of 8
int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
- #else
+ #else
int nb_re_pusch2 = nb_re_pusch;
- #endif
+ #endif
// perform IDFT operation on the compensated rxdata if transform precoding is enabled
nr_idft(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * nb_re_pusch2], nb_re_pusch);
@@ -1374,14 +2123,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
/*-------------------- LLRs computation -------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------*/
start_meas(&gNB->ulsch_llr_stats);
- nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)],
- gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
- gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
- &gNB->pusch_vars[ulsch_id]->llr[rxdataF_ext_offset * rel15_ul->qam_mod_order],
- rel15_ul->rb_size,
- gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol],
- symbol,
- rel15_ul->qam_mod_order);
+ for (aatx=0; aatx < rel15_ul->nrOfLayers; aatx++) {
+ nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aatx*frame_parms->nb_antennas_rx][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+ gNB->pusch_vars[ulsch_id]->ul_ch_mag0[aatx*frame_parms->nb_antennas_rx],
+ gNB->pusch_vars[ulsch_id]->ul_ch_magb0[aatx*frame_parms->nb_antennas_rx],
+ &gNB->pusch_vars[ulsch_id]->llr_layers[aatx][rxdataF_ext_offset * rel15_ul->qam_mod_order],
+ rel15_ul->rb_size,
+ gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol],
+ symbol,
+ rel15_ul->qam_mod_order);
+ }
stop_meas(&gNB->ulsch_llr_stats);
rxdataF_ext_offset += gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol];
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
index bf96a76106..ad41ebf3d6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
@@ -64,7 +64,7 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp,
//----------------------------------------------------------------------------------------------
void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
- int32_t **ul_ch_mag,
+ int32_t *ul_ch_mag,
int16_t *ulsch_llr,
uint32_t nb_rb,
uint32_t nb_re,
@@ -110,12 +110,12 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
- ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
+ ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
#else
- ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
+ ch_mag = (__m128i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
#endif
#elif defined(__arm__)
- ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
+ ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)];
#endif
#ifdef __AVX2__
@@ -231,8 +231,8 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
//----------------------------------------------------------------------------------------------
void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
- int32_t **ul_ch_mag,
- int32_t **ul_ch_magb,
+ int32_t *ul_ch_mag,
+ int32_t *ul_ch_magb,
int16_t *ulsch_llr,
uint32_t nb_rb,
uint32_t nb_re,
@@ -265,15 +265,15 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
- ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
- ch_magb = (__m256i*)&ul_ch_magb[0][(symbol*(off+(nb_rb*12)))];
+ ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
+ ch_magb = (__m256i*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))];
#else
- ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)];
- ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)];
+ ch_mag = (__m128i*)&ul_ch_mag[(symbol*nb_rb*12)];
+ ch_magb = (__m128i*)&ul_ch_magb[(symbol*nb_rb*12)];
#endif
#elif defined(__arm__)
- ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
- ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)];
+ ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)];
+ ch_magb = (int16x8_t*)&ul_ch_magb[(symbol*nb_rb*12)];
#endif
#ifdef __AVX2__
@@ -471,8 +471,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
void nr_ulsch_compute_llr(int32_t *rxdataF_comp,
- int32_t **ul_ch_mag,
- int32_t **ul_ch_magb,
+ int32_t *ul_ch_mag,
+ int32_t *ul_ch_magb,
int16_t *ulsch_llr,
uint32_t nb_rb,
uint32_t nb_re,
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index b2ff4f758c..1b91371158 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -190,7 +190,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
pucch_pdu->bit_len_harq,pucch_pdu->sr_flag);
NR_gNB_UCI_STATS_t *uci_stats=NULL;
- NR_gNB_UCI_STATS_t *first_uci_stats=NULL;
+ NR_gNB_UCI_STATS_t *first_uci_stats = gNB->uci_stats;
for (int i=0;iuci_stats[i].rnti == pucch_pdu->rnti) {
uci_stats = &gNB->uci_stats[i];
@@ -1545,7 +1545,6 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
#ifdef DEBUG_NR_PUCCH_RX
LOG_I(PHY,"slot %d PUCCH2 cw_ML %d, metric %d dB\n",slot,cw_ML,corr_dB);
#endif
-
decodedPayload[0]=(uint64_t)cw_ML;
}
else { // polar coded case
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 0c520aabe7..624894aeb9 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -148,7 +148,7 @@ short filt8_dcr0_h[8]= {
0,4096,8192,12288,16384,0,0,0};
short filt8_l1[8] = {
-24576,16384,0,0,0,0,0,0};
+24576,16384,8192,0,0,0,0,0};
short filt8_ml1[8] = {
-8192,0,8192,16384,8192,0,0,0};
@@ -163,10 +163,10 @@ short filt8_mm1[8]= {
0,0,0,0,8192,16384,8192,0};
short filt8_dcl1[8]= {
-0,0,0,16384,12288,8192,4096,0};
+0,0,16384,12288,8192,4096,0,0};
short filt8_dcr1[8]= {
-0,0,0,0,4096,8192,12288,16384};
+0,0,0,4096,8192,12288,16384,0};
short filt8_dcl1_h[8]= {
0,16384,12288,8192,4096,0,0,0};
@@ -282,4 +282,17 @@ short filt16_middle4[16] = {
4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0};
short filt16_end[16] = {
- 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0};
\ No newline at end of file
+ 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0};
+
+// CSI-RS
+short filt24_start[24] = {
+ 12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779,
+ 0,0,0,0,0,0,0,0,0,0,0,0};
+
+short filt24_end[24] = {
+ 4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605,
+ 16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
+
+short filt24_middle[24] = {
+ 4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605,
+ 12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779};
\ No newline at end of file
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index 72d1318545..41109cb7bb 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -193,4 +193,10 @@ extern short filt8_end[8];
extern short filt16_start[16];
extern short filt16_middle4[16];
extern short filt16_end[16];
+
+/*CSI-RS*/
+extern short filt24_start[24];
+extern short filt24_end[24];
+extern short filt24_middle[24];
+
#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 3b4ce9a423..037851be0c 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -34,6 +34,7 @@
//#define DEBUG_PDSCH
//#define DEBUG_PDCCH
+#define NO_INTERP 1
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
@@ -692,7 +693,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
k = bwp_start_subcarrier;
int re_offset = k;
-#ifdef DEBUG_CH
+#ifdef DEBUG_PDSCH
printf("PDSCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -1244,6 +1245,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 6;
ch[1] = ch_1 / 6;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
multadd_real_vector_complex_scalar(filt8_avlip0,
ch,
dl_ch,
@@ -1261,6 +1266,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch,
8);
dl_ch -= 24;
+#endif
for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) {
@@ -1308,6 +1314,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 6;
ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -1329,6 +1340,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch,
8);
dl_ch -= 16;
+#endif
}
ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
@@ -1375,6 +1387,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 6;
ch[1] = ch_1 / 6;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -1389,6 +1405,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch,
dl_ch,
8);
+#endif
}
else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
int32_t ch_0, ch_1;
@@ -1424,6 +1441,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 4;
ch[1] = ch_1 / 4;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
multadd_real_vector_complex_scalar(filt8_avlip0,
ch,
dl_ch,
@@ -1441,6 +1462,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch,
8);
dl_ch -= 24;
+#endif
for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) {
int32_t ch_0, ch_1;
@@ -1476,6 +1498,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 4;
ch[1] = ch_1 / 4;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -1497,6 +1523,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch,
8);
dl_ch -= 16;
+#endif
}
ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
@@ -1530,6 +1557,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = ch_0 / 4;
ch[1] = ch_1 / 4;
+#if NO_INTERP
+ for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+ dl_ch+=24;
+#else
dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
@@ -1544,6 +1575,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch,
dl_ch,
8);
+#endif
}
#ifdef DEBUG_PDSCH
dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
@@ -1673,7 +1705,6 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
/*------------------------------------------------------------------------------------------------------- */
nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
rnti,
- (int16_t *)&pdsch_vars[gNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch],
nr_slot_rx,
symbol,frame_parms->ofdm_symbol_size,
(int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)],
diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
new file mode 100644
index 0000000000..79fd7a3dd2
--- /dev/null
+++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
@@ -0,0 +1,380 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/***********************************************************************
+*
+* FILENAME : csi_rx.c
+*
+* MODULE :
+*
+* DESCRIPTION : function to receive the channel state information
+*
+************************************************************************/
+
+#include
+#include
+#include
+
+#include "nr_transport_proto_ue.h"
+#include "PHY/phy_extern_nr_ue.h"
+#include "common/utils/nr/nr_common.h"
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
+
+
+//#define NR_CSIRS_DEBUG
+
+bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol) {
+
+ bool ret = false;
+
+ // 38.211-Table 7.4.1.5.3-1: CSI-RS locations within a slot
+ switch(csirs_config_pdu.row){
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ case 9:
+ if(symbol == csirs_config_pdu.symb_l0) {
+ ret = true;
+ }
+ break;
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 11:
+ case 12:
+ if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) ) {
+ ret = true;
+ }
+ break;
+ case 13:
+ case 14:
+ case 16:
+ case 17:
+ if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) ||
+ symbol == csirs_config_pdu.symb_l1 || symbol == (csirs_config_pdu.symb_l1+1)) {
+ ret = true;
+ }
+ break;
+ case 15:
+ case 18:
+ if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) || symbol == (csirs_config_pdu.symb_l0+2) ) {
+ ret = true;
+ }
+ break;
+ default:
+ AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csirs_config_pdu.row);
+ }
+
+ return ret;
+}
+
+int nr_get_csi_rs_signal(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+ nr_csi_rs_info_t *nr_csi_rs_info,
+ int32_t **csi_rs_received_signal) {
+
+ int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
+ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+
+ for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+ memset(csi_rs_received_signal[ant_rx], 0, frame_parms->samples_per_frame_wCP*sizeof(int32_t));
+
+ for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+ // for freq density 0.5 checks if even or odd RB
+ if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+ continue;
+ }
+
+ for (int cdm_id = 0; cdm_id < nr_csi_rs_info->N_cdm_groups; cdm_id++) {
+ for (int s = 0; s < nr_csi_rs_info->CDM_group_size; s++) {
+
+ // loop over frequency resource elements within a group
+ for (int kp = 0; kp <= nr_csi_rs_info->kprime; kp++) {
+
+ uint16_t k = (frame_parms->first_carrier_offset + (rb*NR_NB_SC_PER_RB)+nr_csi_rs_info->koverline[cdm_id] + kp) % frame_parms->ofdm_symbol_size;
+
+ // loop over time resource elements within a group
+ for (int lp = 0; lp <= nr_csi_rs_info->lprime; lp++) {
+ uint16_t symb = lp + nr_csi_rs_info->loverline[cdm_id];
+ uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+ int16_t *rx_signal = (int16_t*)&rxdataF[ant_rx][symbol_offset];
+ int16_t *rx_csi_rs_signal = (int16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+ rx_csi_rs_signal[k<<1] = rx_signal[k<<1];
+ rx_csi_rs_signal[(k<<1)+1] = rx_signal[(k<<1)+1];
+
+#ifdef NR_CSIRS_DEBUG
+ int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP;
+ uint16_t port_tx = s+nr_csi_rs_info->j[cdm_id]*nr_csi_rs_info->CDM_group_size;
+ int16_t *tx_csi_rs_signal = (int16_t*)&nr_csi_rs_info->csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+ LOG_I(NR_PHY, "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n",
+ symb,
+ k,
+ port_tx+3000,
+ tx_csi_rs_signal[k<<1],
+ tx_csi_rs_signal[(k<<1)+1],
+ ant_rx,
+ rx_csi_rs_signal[k<<1],
+ rx_csi_rs_signal[(k<<1)+1]);
+#endif
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+uint32_t calc_power_csirs(uint16_t *x, fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) {
+ uint64_t sum_x = 0;
+ uint64_t sum_x2 = 0;
+ uint16_t size = 0;
+ for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+ if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+ continue;
+ }
+ sum_x = sum_x + x[rb-csirs_config_pdu->start_rb];
+ sum_x2 = sum_x2 + x[rb]*x[rb-csirs_config_pdu->start_rb];
+ size++;
+ }
+ return sum_x2/size - (sum_x/size)*(sum_x/size);
+}
+
+int nr_csi_rs_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+ nr_csi_rs_info_t *nr_csi_rs_info,
+ int32_t **csi_rs_generated_signal,
+ int32_t **csi_rs_received_signal,
+ int32_t ***csi_rs_estimated_channel_freq,
+ uint32_t *noise_power) {
+
+ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP;
+ *noise_power = 0;
+
+ for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+
+ /// LS channel estimation
+
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ memset(nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
+ }
+
+ for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+ // for freq density 0.5 checks if even or odd RB
+ if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+ continue;
+ }
+
+ for (int cdm_id = 0; cdm_id < nr_csi_rs_info->N_cdm_groups; cdm_id++) {
+ for (int s = 0; s < nr_csi_rs_info->CDM_group_size; s++) {
+
+ uint16_t port_tx = s+nr_csi_rs_info->j[cdm_id]*nr_csi_rs_info->CDM_group_size;
+
+ // loop over frequency resource elements within a group
+ for (int kp = 0; kp <= nr_csi_rs_info->kprime; kp++) {
+
+ uint16_t kinit = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+ uint16_t k = kinit + nr_csi_rs_info->koverline[cdm_id] + kp;
+
+ // loop over time resource elements within a group
+ for (int lp = 0; lp <= nr_csi_rs_info->lprime; lp++) {
+ uint16_t symb = lp + nr_csi_rs_info->loverline[cdm_id];
+ uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+ int16_t *tx_csi_rs_signal = (int16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+ int16_t *rx_csi_rs_signal = (int16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+ int16_t *csi_rs_ls_estimated_channel = (int16_t*)&nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+
+ int16_t csi_rs_ls_estimated_channel_re = (int16_t)(((int32_t)tx_csi_rs_signal[k<<1]*rx_csi_rs_signal[k<<1] + (int32_t)tx_csi_rs_signal[(k<<1)+1]*rx_csi_rs_signal[(k<<1)+1])>>nr_csi_rs_info->csi_rs_generated_signal_bits);
+ int16_t csi_rs_ls_estimated_channel_im = (int16_t)(((int32_t)tx_csi_rs_signal[k<<1]*rx_csi_rs_signal[(k<<1)+1] - (int32_t)tx_csi_rs_signal[(k<<1)+1]*rx_csi_rs_signal[k<<1])>>nr_csi_rs_info->csi_rs_generated_signal_bits);
+
+ // This is not just the LS estimation for each (k,l), but also the sum of the different contributions
+ // for the sake of optimizing the memory used.
+ csi_rs_ls_estimated_channel[kinit<<1] += csi_rs_ls_estimated_channel_re;
+ csi_rs_ls_estimated_channel[(kinit<<1)+1] += csi_rs_ls_estimated_channel_im;
+ }
+ }
+ }
+ }
+ }
+
+#ifdef NR_CSIRS_DEBUG
+ for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
+ if(!is_csi_rs_in_symbol(*csirs_config_pdu,symb)) {
+ continue;
+ }
+ for(int k = 0; kofdm_symbol_size; k++) {
+ LOG_I(NR_PHY, "l,k (%2d,%4d) | ", symb, k);
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+ int16_t *tx_csi_rs_signal = (int16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+ int16_t *rx_csi_rs_signal = (int16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+ int16_t *csi_rs_ls_estimated_channel = (int16_t*)&nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+ printf("port_tx %d --> ant_rx %d, tx (%4d,%4d), rx (%4d,%4d), ls (%4d,%4d) | ",
+ port_tx+3000, ant_rx,
+ tx_csi_rs_signal[k<<1], tx_csi_rs_signal[(k<<1)+1],
+ rx_csi_rs_signal[k<<1], rx_csi_rs_signal[(k<<1)+1],
+ csi_rs_ls_estimated_channel[k<<1], csi_rs_ls_estimated_channel[(k<<1)+1]);
+ }
+ printf("\n");
+ }
+ }
+#endif
+
+ /// Channel interpolation
+
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ memset(csi_rs_estimated_channel_freq[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
+ }
+
+ for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+ // for freq density 0.5 checks if even or odd RB
+ if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+ continue;
+ }
+
+ uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ int16_t *csi_rs_ls_estimated_channel = (int16_t*)&nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx][k];
+ int16_t *csi_rs_estimated_channel16 = (int16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k];
+ if( (k == 0) || (k == frame_parms->first_carrier_offset) ) { // Start of OFDM symbol case or first occupied subcarrier case
+ multadd_real_vector_complex_scalar(filt24_start, csi_rs_ls_estimated_channel, csi_rs_estimated_channel16, 24);
+ } else if( ( (k + NR_NB_SC_PER_RB) >= frame_parms->ofdm_symbol_size) ||
+ (rb == (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs-1)) ) { // End of OFDM symbol case or Last occupied subcarrier case
+ multadd_real_vector_complex_scalar(filt24_end, csi_rs_ls_estimated_channel, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24);
+ } else { // Middle case
+ multadd_real_vector_complex_scalar(filt24_middle, csi_rs_ls_estimated_channel, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24);
+ }
+ }
+ }
+
+ /// Power noise estimation
+ uint16_t noise_real[frame_parms->nb_antennas_rx][nr_csi_rs_info->N_ports][csirs_config_pdu->nr_of_rbs];
+ uint16_t noise_imag[frame_parms->nb_antennas_rx][nr_csi_rs_info->N_ports][csirs_config_pdu->nr_of_rbs];
+ for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+ if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+ continue;
+ }
+ uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ int16_t *csi_rs_ls_estimated_channel = (int16_t*)&nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx][k];
+ int16_t *csi_rs_estimated_channel16 = (int16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k];
+ noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel[0]-csi_rs_estimated_channel16[0]);
+ noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel[1]-csi_rs_estimated_channel16[1]);
+ }
+ }
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ *noise_power += (calc_power_csirs(noise_real[ant_rx][port_tx], csirs_config_pdu) + calc_power_csirs(noise_imag[ant_rx][port_tx],csirs_config_pdu));
+ }
+
+#ifdef NR_CSIRS_DEBUG
+ for(int k = 0; kofdm_symbol_size; k++) {
+ int rb = k >= frame_parms->first_carrier_offset ?
+ (k - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB :
+ (k + frame_parms->ofdm_symbol_size - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB;
+ LOG_I(NR_PHY, "(k = %4d) |\t", k);
+ for(uint16_t port_tx = 0; port_txN_ports; port_tx++) {
+ int16_t *csi_rs_ls_estimated_channel = (int16_t*)&nr_csi_rs_info->csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+ int16_t *csi_rs_estimated_channel16 = (int16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][0];
+ printf("Channel port_tx %d --> ant_rx %d : ls (%4d,%4d), int (%4d,%4d), noise (%4d,%4d) | ",
+ port_tx+3000, ant_rx,
+ csi_rs_ls_estimated_channel[k<<1], csi_rs_ls_estimated_channel[(k<<1)+1],
+ csi_rs_estimated_channel16[k<<1], csi_rs_estimated_channel16[(k<<1)+1],
+ rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb],
+ rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb]);
+ }
+ printf("\n");
+ }
+#endif
+
+ }
+
+ *noise_power /= (frame_parms->nb_antennas_rx*nr_csi_rs_info->N_ports);
+
+#ifdef NR_CSIRS_DEBUG
+ LOG_I(NR_PHY, "Noise power estimation based on CSI-RS: %i\n", *noise_power);
+#endif
+
+ return 0;
+}
+
+int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) {
+ return 0;
+}
+
+int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) {
+
+ if(!ue->csirs_vars[gNB_id]->active) {
+ return -1;
+ }
+
+ fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = (fapi_nr_dl_config_csirs_pdu_rel15_t*)&ue->csirs_vars[gNB_id]->csirs_config_pdu;
+
+#ifdef NR_CSIRS_DEBUG
+ LOG_I(NR_PHY, "csirs_config_pdu->subcarrier_spacing = %i\n", csirs_config_pdu->subcarrier_spacing);
+ LOG_I(NR_PHY, "csirs_config_pdu->cyclic_prefix = %i\n", csirs_config_pdu->cyclic_prefix);
+ LOG_I(NR_PHY, "csirs_config_pdu->start_rb = %i\n", csirs_config_pdu->start_rb);
+ LOG_I(NR_PHY, "csirs_config_pdu->nr_of_rbs = %i\n", csirs_config_pdu->nr_of_rbs);
+ LOG_I(NR_PHY, "csirs_config_pdu->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csirs_config_pdu->csi_type);
+ LOG_I(NR_PHY, "csirs_config_pdu->row = %i\n", csirs_config_pdu->row);
+ LOG_I(NR_PHY, "csirs_config_pdu->freq_domain = %i\n", csirs_config_pdu->freq_domain);
+ LOG_I(NR_PHY, "csirs_config_pdu->symb_l0 = %i\n", csirs_config_pdu->symb_l0);
+ LOG_I(NR_PHY, "csirs_config_pdu->symb_l1 = %i\n", csirs_config_pdu->symb_l1);
+ LOG_I(NR_PHY, "csirs_config_pdu->cdm_type = %i\n", csirs_config_pdu->cdm_type);
+ LOG_I(NR_PHY, "csirs_config_pdu->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csirs_config_pdu->freq_density);
+ LOG_I(NR_PHY, "csirs_config_pdu->scramb_id = %i\n", csirs_config_pdu->scramb_id);
+ LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset = %i\n", csirs_config_pdu->power_control_offset);
+ LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset_ss = %i\n", csirs_config_pdu->power_control_offset_ss);
+#endif
+
+ nr_generate_csi_rs(ue->frame_parms,
+ ue->nr_csi_rs_info->csi_rs_generated_signal,
+ AMP,
+ ue->nr_csi_rs_info,
+ (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *) csirs_config_pdu,
+ proc->nr_slot_rx);
+
+ nr_get_csi_rs_signal(ue,
+ proc,
+ csirs_config_pdu,
+ ue->nr_csi_rs_info,
+ ue->nr_csi_rs_info->csi_rs_received_signal);
+
+ nr_csi_rs_channel_estimation(ue,
+ proc,
+ csirs_config_pdu,
+ ue->nr_csi_rs_info,
+ ue->nr_csi_rs_info->csi_rs_generated_signal,
+ ue->nr_csi_rs_info->csi_rs_received_signal,
+ ue->nr_csi_rs_info->csi_rs_estimated_channel_freq,
+ ue->nr_csi_rs_info->noise_power);
+ return 0;
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index a832e8f29c..403f016e79 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -430,8 +430,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint16_t nb_symb_sch,
uint8_t nr_slot_rx,
uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag) {
+ uint8_t is_crnti) {
uint32_t A,E;
uint32_t G;
uint32_t ret,offset;
@@ -449,7 +448,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
LOG_D(PHY,"Round %d RV idx %d\n",harq_process->DLround,harq_process->rvidx);
uint8_t kc;
uint16_t nb_rb;// = 30;
- double Coderate;// = 0.0;
uint8_t dmrs_Type = harq_process->dmrsConfigType;
AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type);
uint8_t nb_re_dmrs;
@@ -499,21 +497,18 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
*/
nb_rb = harq_process->nb_rb;
harq_process->trials[harq_process->DLround]++;
- 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*dmrs_length, 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, dmrs_length, harq_process->Qm,harq_process->Nl);
G = harq_process->G;
- LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",
- frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+ // target_code_rate is in 0.1 units
+ float Coderate = (float) harq_process->R / 10240.0f;
- if ((harq_process->R)<1024)
- Coderate = (float) (harq_process->R) /(float) 1024;
- else
- Coderate = (float) (harq_process->R) /(float) 2048;
+ LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d Qm %d Coderate %f\n",
+ frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch, nb_rb, harq_process->Qm, Coderate);
if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
p_decParams->BG = 2;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 9cedc33356..cd1bc9d3b2 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -260,13 +260,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
return -1;
}
- dlsch0_harq->Qm = nr_get_Qm_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
- dlsch0_harq->R = nr_get_code_rate_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
- if (dlsch0_harq->Qm == 0 || dlsch0_harq->R == 0) {
- LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
- return -1;
- }
-
#ifdef DEBUG_HARQ
printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode);
printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1);
@@ -2600,7 +2593,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
}
if (dlsch1_harq) {
- switch (nr_get_Qm_dl(dlsch1_harq->mcs,dlsch1_harq->mcs_table)) {
+ switch (dlsch1_harq->Qm) {
case 2 :
if (rx_type==rx_standard) {
nr_dlsch_qpsk_llr(frame_parms,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index b38c1ff1d3..149827163f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -362,6 +362,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
nr_gold_pdsch(ue, i, ue->scramblingID_dlsch[i]);
}
+ nr_init_csi_rs(fp, ue->nr_csi_rs_info->nr_gold_csi_rs, fp->Nid_cell);
+
// initialize the pusch dmrs
for (int i=0; iscramblingID_ulsch[i]=fp->Nid_cell;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index 4927fe37a2..8437b8f8f3 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -67,7 +67,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
uint8_t Mod_id, fd_occasion, preamble_index, restricted_set, not_found;
uint16_t rootSequenceIndex, prach_fmt_id, NCS, *prach_root_sequence_map, preamble_offset = 0;
uint16_t preamble_shift = 0, preamble_index0, n_shift_ra, n_shift_ra_bar, d_start=INT16_MAX, numshift, N_ZC, u, offset, offset2, first_nonzero_root_idx;
- int16_t prach_tmp[98304*2*4] __attribute__((aligned(32)));
+ int16_t prach_tmp[(4688+4*24576)*4*2] __attribute__((aligned(32)));
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
int32_t Xu_re, Xu_im;
@@ -102,10 +102,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
ue->X_u);
- if (slot % (fp->slots_per_subframe / 2) == 0)
- sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
- else
- sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+ if (prachStartSymbol == 0) {
+ sample_offset_slot = 0;
+ } else if (fp->slots_per_subframe == 1) {
+ if (prachStartSymbol <= 7)
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+ else
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
+ } else {
+ if (slot % (fp->slots_per_subframe / 2) == 0)
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+ else
+ sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+ }
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
@@ -232,10 +241,139 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
preamble_offset,
first_nonzero_root_idx);
- Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx];
+ // Ncp and dftlen here is given in terms of T_s wich is 30.72MHz sampling
+ if (prach_sequence_length == 0) {
+ switch (prach_fmt_id) {
+ case 0:
+ Ncp = 3168;
+ dftlen = 24576;
+ break;
- #if defined (PRACH_WRITE_OUTPUT_DEBUG)
- LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1);
+ case 1:
+ Ncp = 21024;
+ dftlen = 24576;
+ break;
+
+ case 2:
+ Ncp = 4688;
+ dftlen = 24576;
+ break;
+
+ case 3:
+ Ncp = 3168;
+ dftlen = 6144;
+ break;
+
+ default:
+ AssertFatal(1==0, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id);
+ break;
+ }
+ } else {
+ switch (prach_fmt_id) {
+ case 4: //A1
+ Ncp = 288 >> mu;
+ break;
+
+ case 5: //A2
+ Ncp = 576 >> mu;
+ break;
+
+ case 6: //A3
+ Ncp = 864 >> mu;
+ break;
+
+ case 7: //B1
+ Ncp = 216 >> mu;
+ break;
+
+ /*
+ case 4: //B2
+ Ncp = 360 >> mu;
+ break;
+
+ case 5: //B3
+ Ncp = 504 >> mu;
+ break;
+ */
+
+ case 8: //B4
+ Ncp = 936 >> mu;
+ break;
+
+ case 9: //C0
+ Ncp = 1240 >> mu;
+ break;
+
+ case 10: //C2
+ Ncp = 2048 >> mu;
+ break;
+
+ default:
+ AssertFatal(1==0,"Unknown PRACH format ID %d\n", prach_fmt_id);
+ break;
+ }
+ dftlen = 2048 >> mu;
+ }
+
+ //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
+ if(fp->numerology_index == 0) {
+ if (prachStartSymbol == 0 || prachStartSymbol == 7)
+ Ncp += 16;
+ }
+ else {
+ if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
+ Ncp += 16;
+ }
+
+ switch(fp->samples_per_subframe) {
+ case 7680:
+ // 5 MHz @ 7.68 Ms/s
+ Ncp >>= 2;
+ dftlen >>= 2;
+ break;
+
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
+ Ncp >>= 1;
+ dftlen >>= 1;
+ break;
+
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ Ncp = Ncp;
+ dftlen = dftlen;
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
+ Ncp = (Ncp*3)/2;
+ dftlen = (dftlen*3)/2;
+ break;
+
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ Ncp <<= 1;
+ dftlen <<= 1;
+ break;
+
+ case 92160:
+ // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+ Ncp *= 3;
+ dftlen *= 3;
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+ Ncp <<= 2;
+ dftlen <<= 2;
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+ }
+
+ #ifdef NR_PRACH_DEBUG
+ LOG_I(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen);
#endif
/********************************************************
@@ -252,99 +390,11 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
*
*********************************************************/
- if (mu==1) {
- switch(fp->samples_per_subframe) {
- case 15360:
- // 10, 15 MHz @ 15.36 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 12288;
- if (prach_fmt_id == 3)
- dftlen = 3072;
- } else { // 839 sequence
- dftlen = 512;
- }
- break;
-
- case 30720:
- // 20, 25, 30 MHz @ 30.72 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 24576;
- if (prach_fmt_id == 3)
- dftlen = 6144;
- } else { // 839 sequence
- dftlen = 1024;
- }
- break;
-
- case 46080:
- // 40 MHz @ 46.08 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 36864;
- if (prach_fmt_id == 3)
- dftlen = 9216;
- } else { // 839 sequence
- dftlen = 1536;
- }
- break;
-
- case 61440:
- // 40, 50, 60 MHz @ 61.44 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 49152;
- if (prach_fmt_id == 3)
- dftlen = 12288;
- } else { // 839 sequence
- dftlen = 2048;
- }
- break;
-
- case 92160:
- // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 73728;
- if (prach_fmt_id == 3)
- dftlen = 18432;
- } else { // 839 sequence
- dftlen = 3072;
- }
- break;
-
- case 122880:
- // 70, 80, 90, 100 MHz @ 122.88 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 98304;
- if (prach_fmt_id == 3)
- dftlen = 24576;
- } else { // 839 sequence
- dftlen = 4096;
- }
- break;
-
- default:
- AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
- }
- }
- else if (mu==3) {
- if (fp->threequarter_fs)
- AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
-
- if (prach_sequence_length == 0)
- AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
-
- if (fp->N_RB_UL == 32)
- dftlen=512;
- else if (fp->N_RB_UL == 66)
- dftlen=1024;
- else
- AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
- }
+ Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx];
+ #if defined (PRACH_WRITE_OUTPUT_DEBUG)
+ LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1);
+ #endif
for (offset=0,offset2=0; offsetnumerology_index == 0) {
- if (prachStartSymbol == 0 || prachStartSymbol == 7)
- use_extended_prach_prefix = 1;
- }
- else {
- if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- use_extended_prach_prefix = 1;
- }
-
- if (mu == 3) {
- switch (fp->samples_per_subframe) {
- case 61440: // 32 PRB case, 61.44 Msps
- Ncp<<=1; //to account for 61.44Mbps
- // This is after cyclic prefix
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_sequence_length == 0)
- AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
- else {
- if (use_extended_prach_prefix)
- Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_512,prachF,prach2,1);
- // here we have |empty | Prach512 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(512<<1),prach2,(512<<2));
- prach_len = (512*2)+Ncp;
- }
- else prach_len = (512*1)+Ncp;
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have |Prefix | Prach512 | Prach512 (if ! 0xc0) |
- } else if (prach_fmt_id == 5) { // 6x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have |empty | Prach512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have |empty | Prach512 | Prach512| empty512 | empty512 |
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have |Prefix | Prach512 |
- prach_len = (512*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have |empty | Prach512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
- memmove(prach2+(512<<3),prach2,(512<<3));
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have |Prefix | Prach512 |
- prach_len = (512*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have |empty | Prach512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
- memmove(prach2+(512<<3),prach2,(512<<3));
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
- memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
- // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have |Prefix | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
- prach_len = (512*12)+Ncp;
- }
- }
- break;
-
- case 122880: // 66 PRB case, 122.88 Msps
- Ncp<<=2; //to account for 122.88Mbps
- // This is after cyclic prefix
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_sequence_length == 0)
- AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
- else {
- if (use_extended_prach_prefix)
- Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_1024,prachF,prach2,1);
- // here we have |empty | Prach1024 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- prach_len = (1024*2)+Ncp;
- }
- else prach_len = (1024*1)+Ncp;
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have |Prefix | Prach1024 | Prach1024 (if ! 0xc0) |
- } else if (prach_fmt_id == 5) { // 6x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have |empty | Prach1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 |
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have |Prefix | Prach1024 |
- prach_len = (1024*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have |empty | Prach1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
- memmove(prach2+(1024<<3),prach2,(1024<<3));
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have |Prefix | Prach1024 |
- prach_len = (1024*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have |empty | Prach1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
- memmove(prach2+(1024<<3),prach2,(1024<<3));
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
- memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
- // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have |Prefix | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
- prach_len = (1024*12)+Ncp;
- }
- }
- break;
-
- default:
- AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
- }
- } else if (mu == 1) {
- switch (fp->samples_per_subframe) {
- case 15360: // full sampling @ 15.36 Ms/s
- Ncp = Ncp/2; // to account for 15.36 Ms/s
- // This is after cyclic prefix
- prach2 = prach+(2*Ncp); // times 2 for complex samples
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
- idft(IDFT_12288,prachF,prach2,1);
- // here we have | empty | Prach12288 |
- memmove(prach,prach+(12288<<1),(Ncp<<2));
- // here we have | Prefix | Prach12288 |
- prach_len = 12288+Ncp;
- } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
- idft(IDFT_12288,prachF,prach2,1);
- // here we have | empty | Prach12288 | empty12288 |
- memmove(prach2+(12288<<1),prach2,(12288<<2));
- // here we have | empty | Prach12288 | Prach12288 |
- memmove(prach,prach+(12288<<2),(Ncp<<2));
- // here we have | Prefix | Prach12288 | Prach12288 |
- prach_len = (12288*2)+Ncp;
- } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
- idft(IDFT_12288,prachF,prach2,1);
- // here we have | empty | Prach12288 | empty12288 | empty12288 | empty12288 |
- memmove(prach2+(12288<<1),prach2,(12288<<2));
- // here we have | empty | Prach12288 | Prach12288 | empty12288 | empty12288 |
- memmove(prach2+(12288<<2),prach2,(12288<<3));
- // here we have | empty | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
- memmove(prach,prach+(12288<<3),(Ncp<<2));
- // here we have | Prefix | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
- prach_len = (12288*4)+Ncp;
- } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 3072 samples @ 15.36 Ms/s
- idft(IDFT_3072,prachF,prach2,1);
- // here we have | empty | Prach3072 | empty3072 | empty3072 | empty3072 |
- memmove(prach2+(3072<<1),prach2,(3072<<2));
- // here we have | empty | Prach3072 | Prach3072 | empty3072 | empty3072 |
- memmove(prach2+(3072<<2),prach2,(3072<<3));
- // here we have | empty | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
- memmove(prach,prach+(3072<<3),(Ncp<<2));
- // here we have | Prefix | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
- prach_len = (3072*4)+Ncp;
- }
- } else { // short PRACH sequence
- if (use_extended_prach_prefix)
- Ncp += 8; // 16*kappa, kappa=0.5 for 15.36 Ms/s
- prach2 = prach+(2*Ncp); // times 2 for complex samples
- if (prach_fmt_id == 9) {
- idft(IDFT_512,prachF,prach2,1);
- // here we have | empty | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have | Prefix | Prach512 |
- prach_len = (512*1)+Ncp;
- } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
- idft(IDFT_512,prachF,prach2,1);
- // here we have | empty | Prach512 | empty512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have | empty | Prach512 | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have | Prefix | Prach512 | Prach512 |
- prach_len = (512*2)+Ncp;
- } else if (prach_fmt_id == 5) { // 4x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have | empty | Prach512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have | empty | Prach512 | Prach512 | empty512 | empty512 |
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 |
- prach_len = (512*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 |
- memmove(prach2+(512<<3),prach2,(512<<3));
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
- prach_len = (512*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x512
- idft(IDFT_512,prachF,prach2,1);
- // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<1),prach2,(512<<2));
- // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<2),prach2,(512<<3));
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<3),prach2,(512<<3));
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
- memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
- // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
- memmove(prach,prach+(512<<1),(Ncp<<2));
- // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
- prach_len = (512*12)+Ncp;
- }
- }
- break;
-
- case 30720: // full sampling @ 30.72 Ms/s
- Ncp = Ncp*1; // to account for 30.72 Ms/s
- // This is after cyclic prefix
- prach2 = prach+(2*Ncp); // times 2 for complex samples
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s
- idft(IDFT_24576,prachF,prach2,1);
- // here we have | empty | Prach24576 |
- memmove(prach,prach+(24576<<1),(Ncp<<2));
- // here we have | Prefix | Prach24576 |
- prach_len = 24576+Ncp;
- } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s
- idft(IDFT_24576,prachF,prach2,1);
- // here we have | empty | Prach24576 | empty24576 |
- memmove(prach2+(24576<<1),prach2,(24576<<2));
- // here we have | empty | Prach24576 | Prach24576 |
- memmove(prach,prach+(24576<<2),(Ncp<<2));
- // here we have | Prefix | Prach24576 | Prach24576 |
- prach_len = (24576*2)+Ncp;
- } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s
- idft(IDFT_24576,prachF,prach2,1);
- // here we have | empty | Prach24576 | empty24576 | empty24576 | empty24576 |
- memmove(prach2+(24576<<1),prach2,(24576<<2));
- // here we have | empty | Prach24576 | Prach24576 | empty24576 | empty24576 |
- memmove(prach2+(24576<<2),prach2,(24576<<3));
- // here we have | empty | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
- memmove(prach,prach+(24576<<3),(Ncp<<2));
- // here we have | Prefix | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
- prach_len = (24576*4)+Ncp;
- } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s
- idft(IDFT_6144,prachF,prach2,1);
- // here we have | empty | Prach6144 | empty6144 | empty6144 | empty6144 |
- memmove(prach2+(6144<<1),prach2,(6144<<2));
- // here we have | empty | Prach6144 | Prach6144 | empty6144 | empty6144 |
- memmove(prach2+(6144<<2),prach2,(6144<<3));
- // here we have | empty | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
- memmove(prach,prach+(6144<<3),(Ncp<<2));
- // here we have | Prefix | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
- prach_len = (6144*4)+Ncp;
- }
- } else { // short PRACH sequence
- if (use_extended_prach_prefix)
- Ncp += 16; // 16*kappa, kappa=1 for 30.72Msps
- prach2 = prach+(2*Ncp); // times 2 for complex samples
- if (prach_fmt_id == 9) {
- idft(IDFT_1024,prachF,prach2,1);
- // here we have | empty | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have | Prefix | Prach1024 |
- prach_len = (1024*1)+Ncp;
- } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
- idft(IDFT_1024,prachF,prach2,1);
- // here we have | empty | Prach1024 | empty1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have | empty | Prach1024 | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have | Prefix | Prach1024 | Prach1024 |
- prach_len = (1024*2)+Ncp;
- } else if (prach_fmt_id == 5) { // 4x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- prach_len = (1024*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<3),prach2,(1024<<3));
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- prach_len = (1024*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x1024
- idft(IDFT_1024,prachF,prach2,1);
- // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<1),prach2,(1024<<2));
- // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<2),prach2,(1024<<3));
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<3),prach2,(1024<<3));
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
- memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
- // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- memmove(prach,prach+(1024<<1),(Ncp<<2));
- // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
- prach_len = (1024*12)+Ncp;
- }
- }
- break;
-
- case 61440: // full sampling @ 61.44 Ms/s
- Ncp = Ncp*2; // to account for 61.44 Ms/s
- // This is after cyclic prefix
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
- idft(IDFT_49152,prachF,prach2,1);
- // here we have |empty | Prach49152|
- memmove(prach,prach+(49152<<1),(Ncp<<2));
- // here we have |Prefix | Prach49152|
- prach_len = 49152+Ncp;
- } else if (prach_fmt_id == 1) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
- idft(IDFT_49152,prachF,prach2,1);
- memmove(prach2+(49152<<1),prach2,(49152<<2));
- // here we have |empty | Prach49152 | Prach49152|
- memmove(prach,prach+(49152<<2),(Ncp<<2));
- // here we have |Prefix | Prach49152 | Prach49152|
- prach_len = (49152*2)+Ncp;
- } else if (prach_fmt_id == 2) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
- idft(IDFT_49152,prachF,prach2,1);
- memmove(prach2+(49152<<1),prach2,(49152<<2));
- // here we have |empty | Prach49152 | Prach49152| empty49152 | empty49152
- memmove(prach2+(49152<<2),prach2,(49152<<3));
- // here we have |empty | Prach49152 | Prach49152| Prach49152 | Prach49152
- memmove(prach,prach+(49152<<3),(Ncp<<2));
- // here we have |Prefix | Prach49152 | Prach49152| Prach49152 | Prach49152
- prach_len = (49152*4)+Ncp;
- } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
- idft(IDFT_12288,prachF,prach2,1);
- memmove(prach2+(12288<<1),prach2,(12288<<2));
- // here we have |empty | Prach12288 | Prach12288| empty12288 | empty12288
- memmove(prach2+(12288<<2),prach2,(12288<<3));
- // here we have |empty | Prach12288 | Prach12288| Prach12288 | Prach12288
- memmove(prach,prach+(12288<<3),(Ncp<<2));
- // here we have |Prefix | Prach12288 | Prach12288| Prach12288 | Prach12288
- prach_len = (12288*4)+Ncp;
- }
- } else { // short PRACH sequence
- if (use_extended_prach_prefix)
- Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_2048,prachF,prach2,1);
- // here we have |empty | Prach2048 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(2048<<1),prach2,(2048<<2));
- prach_len = (2048*2)+Ncp;
- }
- else prach_len = (2048*1)+Ncp;
- memmove(prach,prach+(2048<<1),(Ncp<<2));
- // here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0) |
- } else if (prach_fmt_id == 5) { // 6x2048
- idft(IDFT_2048,prachF,prach2,1);
- // here we have |empty | Prach2048 |
- memmove(prach2+(2048<<1),prach2,(2048<<2));
- // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 |
- memmove(prach2+(2048<<2),prach2,(2048<<3));
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 |
- memmove(prach,prach+(2048<<1),(Ncp<<2));
- // here we have |Prefix | Prach2048 |
- prach_len = (2048*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x2048
- idft(IDFT_2048,prachF,prach2,1);
- // here we have |empty | Prach2048 |
- memmove(prach2+(2048<<1),prach2,(2048<<2));
- // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048
- memmove(prach2+(2048<<2),prach2,(2048<<3));
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048
- memmove(prach2+(2048<<3),prach2,(2048<<3));
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048
- memmove(prach,prach+(2048<<1),(Ncp<<2));
- // here we have |Prefix | Prach2048 |
- prach_len = (2048*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x2048
- idft(IDFT_2048,prachF,prach2,1);
- // here we have |empty | Prach2048 |
- memmove(prach2+(2048<<1),prach2,(2048<<2));
- // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048
- memmove(prach2+(2048<<2),prach2,(2048<<3));
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048
- memmove(prach2+(2048<<3),prach2,(2048<<3));
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048
- memmove(prach2+(2048<<1)*6,prach2,(2048<<2)*6);
- // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048|
- memmove(prach,prach+(2048<<1),(Ncp<<2));
- // here we have |Prefix | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048|
- prach_len = (2048*12)+Ncp;
- }
- }
- break;
-
- case 46080: // threequarter sampling @ 46.08 Ms/s
- Ncp = (Ncp*3)/2;
- prach2 = prach+(Ncp<<1);
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) {
- idft(IDFT_36864,prachF,prach2,1);
- // here we have |empty | Prach73728|
- memmove(prach,prach+(36864<<1),(Ncp<<2));
- // here we have |Prefix | Prach73728|
- prach_len = (36864*1)+Ncp;
- } else if (prach_fmt_id == 1) {
- idft(IDFT_36864,prachF,prach2,1);
- memmove(prach2+(36864<<1),prach2,(36864<<2));
- // here we have |empty | Prach73728 | Prach73728|
- memmove(prach,prach+(36864<<2),(Ncp<<2));
- // here we have |Prefix | Prach73728 | Prach73728|
- prach_len = (36864*2)+Ncp;
- } else if (prach_fmt_id == 2) {
- idft(IDFT_36864,prachF,prach2,1);
- memmove(prach2+(36864<<1),prach2,(36864<<2));
- // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728
- memmove(prach2+(36864<<2),prach2,(36864<<3));
- // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728
- memmove(prach,prach+(36864<<3),(Ncp<<2));
- // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728
- prach_len = (36864*4)+Ncp;
- } else if (prach_fmt_id == 3) {
- idft(IDFT_9216,prachF,prach2,1);
- memmove(prach2+(9216<<1),prach2,(9216<<2));
- // here we have |empty | Prach9216 | Prach9216| empty9216 | empty9216
- memmove(prach2+(9216<<2),prach2,(9216<<3));
- // here we have |empty | Prach9216 | Prach9216| Prach9216 | Prach9216
- memmove(prach,prach+(9216<<3),(Ncp<<2));
- // here we have |Prefix | Prach9216 | Prach9216| Prach9216 | Prach9216
- prach_len = (9216*4)+Ncp;
- }
- } else { // short sequence
- if (use_extended_prach_prefix)
- Ncp+=24; // 16*kappa, kappa=1.5 for 46.08Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_1536,prachF,prach2,1);
- // here we have |empty | Prach1536 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(1536<<1),prach2,(1536<<2));
- prach_len = (1536*2)+Ncp;
- } else prach_len = (1536*1)+Ncp;
-
- memmove(prach,prach+(1536<<1),(Ncp<<2));
- // here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) |
-
- } else if (prach_fmt_id == 5) { // 6x1536
- idft(IDFT_1536,prachF,prach2,1);
- // here we have |empty | Prach1536 |
- memmove(prach2+(1536<<1),prach2,(1536<<2));
- // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 |
- memmove(prach2+(1536<<2),prach2,(1536<<3));
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 |
- memmove(prach,prach+(1536<<1),(Ncp<<2));
- // here we have |Prefix | Prach1536 |
- prach_len = (1536*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x1536
- idft(IDFT_1536,prachF,prach2,1);
- // here we have |empty | Prach1536 |
- memmove(prach2+(1536<<1),prach2,(1536<<2));
- // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536
- memmove(prach2+(1536<<2),prach2,(1536<<3));
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536
- memmove(prach2+(1536<<3),prach2,(1536<<3));
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536
- memmove(prach,prach+(1536<<1),(Ncp<<2));
- // here we have |Prefix | Prach1536 |
- prach_len = (1536*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x1536
- idft(IDFT_1536,prachF,prach2,1);
- // here we have |empty | Prach1536 |
- memmove(prach2+(1536<<1),prach2,(1536<<2));
- // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536
- memmove(prach2+(1536<<2),prach2,(1536<<3));
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536
- memmove(prach2+(1536<<3),prach2,(1536<<3));
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536
- memmove(prach2+(1536<<1)*6,prach2,(1536<<2)*6);
- // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536|
- memmove(prach,prach+(1536<<1),(Ncp<<2));
- // here we have |Prefix | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536|
- prach_len = (1536*12)+Ncp;
- }
- }
- break;
-
- case 122880: // full sampling @ 122.88 Ms/s
- Ncp<<=2; //to account for 122.88Mbps
- // This is after cyclic prefix
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 98304 samples @ 122.88 Ms/s
- idft(IDFT_98304,prachF,prach2,1);
- // here we have |empty | Prach98304|
- memmove(prach,prach+(98304<<1),(Ncp<<2));
- // here we have |Prefix | Prach98304|
- prach_len = (98304*1)+Ncp;
- } else if (prach_fmt_id == 1) {
- idft(IDFT_98304,prachF,prach2,1);
- memmove(prach2+(98304<<1),prach2,(98304<<2));
- // here we have |empty | Prach98304 | Prach98304|
- memmove(prach,prach+(98304<<2),(Ncp<<2));
- // here we have |Prefix | Prach98304 | Prach98304|
- prach_len = (98304*2)+Ncp;
- } else if (prach_fmt_id == 2) {
- idft(IDFT_98304,prachF,prach2,1);
- memmove(prach2+(98304<<1),prach2,(98304<<2));
- // here we have |empty | Prach98304 | Prach98304| empty98304 | empty98304
- memmove(prach2+(98304<<2),prach2,(98304<<3));
- // here we have |empty | Prach98304 | Prach98304| Prach98304 | Prach98304
- memmove(prach,prach+(98304<<3),(Ncp<<2));
- // here we have |Prefix | Prach98304 | Prach98304| Prach98304 | Prach98304
- prach_len = (98304*4)+Ncp;
- } else if (prach_fmt_id == 3) { // 4x6144, Ncp 3168
- idft(IDFT_24576,prachF,prach2,1);
- memmove(prach2+(24576<<1),prach2,(24576<<2));
- // here we have |empty | Prach24576 | Prach24576| empty24576 | empty24576
- memmove(prach2+(24576<<2),prach2,(24576<<3));
- // here we have |empty | Prach24576 | Prach24576| Prach24576 | Prach24576
- memmove(prach,prach+(24576<<3),(Ncp<<2));
- // here we have |Prefix | Prach24576 | Prach24576| Prach24576 | Prach24576
- prach_len = (24576*4)+Ncp;
- }
- } else { // short sequence
- if (use_extended_prach_prefix)
- Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_4096,prachF,prach2,1);
- // here we have |empty | Prach4096 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(4096<<1),prach2,(4096<<2));
- prach_len = (4096*2)+Ncp;
- } else prach_len = (4096*1)+Ncp;
- memmove(prach,prach+(4096<<1),(Ncp<<2));
- // here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) |
- } else if (prach_fmt_id == 5) { // 4x4096
- idft(IDFT_4096,prachF,prach2,1);
- // here we have |empty | Prach4096 |
- memmove(prach2+(4096<<1),prach2,(4096<<2));
- // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 |
- memmove(prach2+(4096<<2),prach2,(4096<<3));
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 |
- memmove(prach,prach+(4096<<1),(Ncp<<2));
- // here we have |Prefix | Prach4096 |
- prach_len = (4096*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 6x4096
- idft(IDFT_4096,prachF,prach2,1);
- // here we have |empty | Prach4096 |
- memmove(prach2+(4096<<1),prach2,(4096<<2));
- // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096
- memmove(prach2+(4096<<2),prach2,(4096<<3));
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096
- memmove(prach2+(4096<<3),prach2,(4096<<3));
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096
- memmove(prach,prach+(4096<<1),(Ncp<<2));
- // here we have |Prefix | Prach4096 |
- prach_len = (4096*6)+Ncp;
- } else if (prach_fmt_id == 8) { // 12x4096
- idft(IDFT_4096,prachF,prach2,1);
- // here we have |empty | Prach4096 |
- memmove(prach2+(4096<<1),prach2,(4096<<2));
- // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096
- memmove(prach2+(4096<<2),prach2,(4096<<3));
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096
- memmove(prach2+(4096<<3),prach2,(4096<<3));
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096
- memmove(prach2+(4096<<1)*6,prach2,(4096<<2)*6);
- // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096|
- memmove(prach,prach+(4096<<1),(Ncp<<2));
- // here we have |Prefix | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096|
- prach_len = (4096*12)+Ncp;
- }
- }
- break;
-
- case 92160: // three quarter sampling @ 92.16 Ms/s
- Ncp = (Ncp*3); //to account for 92.16 Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_sequence_length == 0){
- if (prach_fmt_id == 0) {
- idft(IDFT_73728,prachF,prach2,1);
- // here we have |empty | Prach73728|
- memmove(prach,prach+(73728<<1),(Ncp<<2));
- // here we have |Prefix | Prach73728|
- prach_len = (73728*1)+Ncp;
- } else if (prach_fmt_id == 1) {
- idft(IDFT_73728,prachF,prach2,1);
- memmove(prach2+(73728<<1),prach2,(73728<<2));
- // here we have |empty | Prach73728 | Prach73728|
- memmove(prach,prach+(73728<<2),(Ncp<<2));
- // here we have |Prefix | Prach73728 | Prach73728|
- prach_len = (73728*2)+Ncp;
- } if (prach_fmt_id == 2) {
- idft(IDFT_73728,prachF,prach2,1);
- memmove(prach2+(73728<<1),prach2,(73728<<2));
- // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728
- memmove(prach2+(73728<<2),prach2,(73728<<3));
- // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728
- memmove(prach,prach+(73728<<3),(Ncp<<2));
- // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728
- prach_len = (73728*4)+Ncp;
- } else if (prach_fmt_id == 3) {
- idft(IDFT_18432,prachF,prach2,1);
- memmove(prach2+(18432<<1),prach2,(18432<<2));
- // here we have |empty | Prach18432 | Prach18432| empty18432 | empty18432
- memmove(prach2+(18432<<2),prach2,(18432<<3));
- // here we have |empty | Prach18432 | Prach18432| Prach18432 | Prach18432
- memmove(prach,prach+(18432<<3),(Ncp<<2));
- // here we have |Prefix | Prach18432 | Prach18432| Prach18432 | Prach18432
- prach_len = (18432*4)+Ncp;
- }
- } else { // short sequence
- if (use_extended_prach_prefix)
- Ncp+=48; // 16*kappa, kappa=3 for 92.16Msps
- prach2 = prach+(Ncp<<1); //times 2 for complex samples
- if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
- idft(IDFT_3072,prachF,prach2,1);
- // here we have |empty | Prach3072 |
- if (prach_fmt_id != 9) {
- memmove(prach2+(3072<<1),prach2,(3072<<2));
- prach_len = (3072*2)+Ncp;
- } else prach_len = (3072*1)+Ncp;
- memmove(prach,prach+(3072<<1),(Ncp<<2));
- // here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) |
- } else if (prach_fmt_id == 6) { // 6x3072
- idft(IDFT_3072,prachF,prach2,1);
- // here we have |empty | Prach3072 |
- memmove(prach2+(3072<<1),prach2,(3072<<2));
- // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072
- memmove(prach2+(3072<<2),prach2,(3072<<3));
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072
- memmove(prach2+(3072<<3),prach2,(3072<<3));
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072
- memmove(prach,prach+(3072<<1),(Ncp<<2));
- // here we have |Prefix | Prach3072 |
- prach_len = (3072*6)+Ncp;
- } else if (prach_fmt_id == 5) { // 4x3072
- idft(IDFT_3072,prachF,prach2,1);
- // here we have |empty | Prach3072 |
- memmove(prach2+(3072<<1),prach2,(3072<<2));
- // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 |
- memmove(prach2+(3072<<2),prach2,(3072<<3));
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 |
- memmove(prach,prach+(3072<<1),(Ncp<<2));
- // here we have |Prefix | Prach3072 |
- prach_len = (3072*4)+Ncp;
- } else if (prach_fmt_id == 6) { // 12x3072
- idft(IDFT_3072,prachF,prach2,1);
- // here we have |empty | Prach3072 |
- memmove(prach2+(3072<<1),prach2,(3072<<2));
- // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072
- memmove(prach2+(3072<<2),prach2,(3072<<3));
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072
- memmove(prach2+(3072<<3),prach2,(3072<<3));
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072
- memmove(prach2+(3072<<1)*6,prach2,(3072<<2)*6);
- // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072|
- memmove(prach,prach+(3072<<1),(Ncp<<2));
- // here we have |Prefix | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072|
- prach_len = (3072*12)+Ncp;
- }
- }
- break;
-
- default:
- AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+ } else { // short PRACH sequence
+ if (prach_fmt_id == 9) {
+ // here we have | empty | Prach |
+ memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+ // here we have | Prefix | Prach |
+ prach_len = (dftlen*1)+Ncp;
+ } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+ // here we have | empty | Prach | empty |
+ memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+ // here we have | empty | Prach | Prach |
+ memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+ // here we have | Prefix | Prach | Prach |
+ prach_len = (dftlen*2)+Ncp;
+ } else if (prach_fmt_id == 5) { // 4xdftlen
+ // here we have | empty | Prach | empty | empty | empty |
+ memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+ // here we have | empty | Prach | Prach | empty | empty |
+ memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+ // here we have | empty | Prach | Prach | Prach | Prach |
+ memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+ // here we have | Prefix | Prach | Prach | Prach | Prach |
+ prach_len = (dftlen*4)+Ncp;
+ } else if (prach_fmt_id == 6) { // 6xdftlen
+ // here we have | empty | Prach | empty | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+ // here we have | empty | Prach | Prach | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+ // here we have | empty | Prach | Prach | Prach | Prach | empty | empty |
+ memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3));
+ // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach |
+ memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+ // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach |
+ prach_len = (dftlen*6)+Ncp;
+ } else if (prach_fmt_id == 8) { // 12xdftlen
+ // here we have | empty | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+ // here we have | empty | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+ // here we have | empty | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3));
+ // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty |
+ memcpy(prach2+(dftlen<<1)*6, prach2, (dftlen<<2)*6);
+ // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach |
+ memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+ // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach |
+ prach_len = (dftlen*12)+Ncp;
}
}
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 72fa255955..a342c93e7c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -63,10 +63,12 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlsch, uint16_t N_RB_DL);
*/
NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint16_t N_RB_DL);
+void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,
+ uint16_t N_RB_UL,
+ NR_DL_FRAME_PARMS* frame_parms);
-void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulsch, uint16_t N_RB_UL);
-NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids);
+NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms);
/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/QPSK reception.
@param stream0_in Input from channel compensated (MR combined) stream 0
@@ -1011,8 +1013,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint16_t nb_symb_sch,
uint8_t nr_slot_rx,
uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag);
+ uint8_t is_crnti);
int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
NR_UE_ULSCH_t *ulsch,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index 08e99434dd..7ecba40c3a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -84,9 +84,9 @@ typedef struct {
/// Pointer to the payload + CRC
uint8_t *b;
/// Pointers to transport block segments
- uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
+ uint8_t **c;
/// LDPC-code outputs
- uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
+ uint8_t **d;
/// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
uint8_t *e;
/// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
index d3f362b90c..80b803779d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
@@ -67,7 +67,7 @@ void nr_rf_card_config_gain(openair0_config_t *openair0_cfg,
openair0_cfg->autocal[i] = 1;
if (i < openair0_cfg->rx_num_channels) {
- LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f\n",
+ LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %.0f, rx_gain %.0f\n",
i,
rf_chain,
openair0_cfg->tx_gain[i],
@@ -103,11 +103,12 @@ void nr_rf_card_config_freq(openair0_config_t *openair0_cfg,
openair0_cfg->autocal[i] = 1;
if (i < openair0_cfg->rx_num_channels) {
- LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %f Hz, rx_freq %f Hz\n",
+ LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f\n",
i,
rf_chain,
openair0_cfg->tx_freq[i],
- openair0_cfg->rx_freq[i]);
+ openair0_cfg->rx_freq[i],
+ openair0_cfg->tune_offset);
}
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 5de615a0cc..d09f2554cc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -43,10 +43,10 @@
//#define DEBUG_ULSCH_CODING
-void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
+void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,
+ uint16_t N_RB_UL,
+ NR_DL_FRAME_PARMS* frame_parms) {
-{
- int i, r;
NR_UE_ULSCH_t *ulsch = *ulschptr;
if (ulsch) {
@@ -54,15 +54,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
printf("Freeing ulsch %p\n",ulsch);
#endif
- uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated
+ int max_layers = (frame_parms->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS;
+ uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers; //number of segments to be allocated
- if (N_RB_UL != 273) {
- a_segments = a_segments*N_RB_UL;
- a_segments = a_segments/273 +1;
- }
+ if (N_RB_UL != 273) {
+ a_segments = a_segments*N_RB_UL;
+ a_segments = a_segments/273 +1;
+ }
-
- for (i=0; iharq_processes[i]) {
if (ulsch->harq_processes[i]->a) {
@@ -81,7 +81,7 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
free16(ulsch->harq_processes[i]->f,14*N_RB_UL*12*8);
ulsch->harq_processes[i]->f = NULL;
}
- for (r=0; rharq_processes[i]->c[r]) {
free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
ulsch->harq_processes[i]->c[r] = NULL;
@@ -94,6 +94,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
}
+ if (ulsch->harq_processes[i]->c) {
+ free16(ulsch->harq_processes[i]->c,a_segments);
+ ulsch->harq_processes[i]->c = NULL;
+ }
+ if (ulsch->harq_processes[i]->d) {
+ free16(ulsch->harq_processes[i]->d,a_segments);
+ ulsch->harq_processes[i]->d = NULL;
+ }
+
free16(ulsch->harq_processes[i],sizeof(NR_UL_UE_HARQ_t));
ulsch->harq_processes[i] = NULL;
}
@@ -101,13 +110,13 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
free16(ulsch,sizeof(NR_UE_ULSCH_t));
*ulschptr = NULL;
}
-
}
-NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids)
-{
- uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated
+NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms) {
+
+ int max_layers = (frame_parms->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS;
+ uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers; //number of segments to be allocated
if (N_RB_UL != 273) {
a_segments = a_segments*N_RB_UL;
@@ -140,6 +149,8 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids)
DevAssert(ulsch->harq_processes[i]->b);
bzero(ulsch->harq_processes[i]->b,ulsch_bytes);
+ ulsch->harq_processes[i]->c = malloc16(a_segments*sizeof(uint8_t *));
+ ulsch->harq_processes[i]->d = malloc16(a_segments*sizeof(uint16_t *));
for (int r = 0; r < a_segments; r++) {
// account for filler in first segment and CRCs for multiple segment case
ulsch->harq_processes[i]->c[r] = malloc16(8448);
@@ -181,14 +192,14 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
unsigned int crc = 1;
NR_UL_UE_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
uint16_t nb_rb = harq_process->pusch_pdu.rb_size;
- uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size*8;
+ uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size<<3;
uint32_t *pz = &harq_process->Z;
- uint8_t mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
- uint16_t R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
+ uint8_t mod_order = harq_process->pusch_pdu.qam_mod_order;
uint16_t Kr=0;
uint32_t r_offset=0;
uint32_t F=0;
- float Coderate = 0.0;
+ // target_code_rate is in 0.1 units
+ float Coderate = (float) harq_process->pusch_pdu.target_code_rate / 10240.0f;
///////////
/////////////////////////////////////////////////////////////////////////////////////////
@@ -196,7 +207,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_IN);
LOG_D(NR_PHY, "ulsch coding nb_rb %d, Nl = %d\n", nb_rb, harq_process->pusch_pdu.nrOfLayers);
- LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d\n", A, G, mod_order);
+ LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d Coderate %f\n", A, G, mod_order, Coderate);
LOG_D(NR_PHY, "harq_pid %d harq_process->ndi %d, pusch_data.new_data_indicator %d\n",
harq_pid,harq_process->ndi,harq_process->pusch_pdu.pusch_data.new_data_indicator);
@@ -216,6 +227,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
printf("\n");
*/
+ int max_payload_bytes = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*harq_process->pusch_pdu.nrOfLayers*1056;
+
if (A > 3824) {
// Add 24-bit crc (polynomial A) to payload
crc = crc24a(harq_process->a,A)>>8;
@@ -227,7 +240,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
harq_process->B = A+24;
- AssertFatal((A/8)+4 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,MAX_NR_ULSCH_PAYLOAD_BYTES);
+ AssertFatal((A/8)+4 <= max_payload_bytes,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,max_payload_bytes);
memcpy(harq_process->b,harq_process->a,(A/8)+4);
}
@@ -241,7 +254,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
harq_process->B = A+16;
- AssertFatal((A/8)+3 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,MAX_NR_ULSCH_PAYLOAD_BYTES);
+ AssertFatal((A/8)+3 <= max_payload_bytes,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,max_payload_bytes);
memcpy(harq_process->b,harq_process->a,(A/8)+3); // using 3 bytes to mimic the case of 24 bit crc
}
@@ -251,11 +264,6 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
///////////////////////// b---->| block segmentation |---->c /////////////////////////
///////////
- if (R<1024)
- Coderate = (float) R /(float) 1024;
- else
- Coderate = (float) R /(float) 2048;
-
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
harq_process->BG = 2;
}
@@ -301,7 +309,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
printf("start ldpc encoder segment %d/%d\n",r,harq_process->C);
printf("input %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]);
for (int cnt =0 ; cnt < 22*(*pz)/8; cnt ++){
- printf("%d ", harq_process->c[r][cnt]);
+ printf("%d ", harq_process->c[r][cnt]);
}
printf("\n");
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index bab0c75aff..a07a19d085 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -38,6 +38,7 @@
#include "PHY/MODULATION/nr_modulation.h"
#include "PHY/MODULATION/modulation_common.h"
#include "common/utils/assertions.h"
+#include "common/utils/nr/nr_common.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
@@ -114,15 +115,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot);
- uint32_t available_bits;
- int32_t **txdataF;
int8_t Wf[2], Wt[2];
int l_prime[2], delta;
uint8_t nb_dmrs_re_per_rb;
- int ap, i;
+ int i;
int sample_offsetF, N_RE_prime;
NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
+ int32_t **txdataF = UE->common_vars.txdataF;
int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
uint16_t number_dmrs_symbols = 0;
@@ -155,9 +155,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data;
- LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
- rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
-
+ LOG_D(PHY,"ulsch TX %x : start_rb %d nb_rb %d mod_order %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
+ rnti,start_rb,nb_rb,mod_order,Nl,pusch_pdu->Tpmi,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
// TbD num_of_mod_symbols is set but never used
N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh;
harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb;
@@ -172,7 +171,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
trace_NRpdu(DIRECTION_UPLINK,
harq_process_ul_ue->a,
harq_process_ul_ue->pusch_pdu.pusch_data.tb_size,
- 0, WS_C_RNTI, rnti, frame, slot, 0, 0);
+ WS_C_RNTI, rnti, frame, slot, 0, 0);
if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1)
return;
@@ -184,7 +183,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
/////////////////////////ULSCH scrambling/////////////////////////
///////////
- available_bits = G;
+ uint32_t available_bits = G;
uint32_t scrambled_output[(available_bits>>5)+1];
memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t));
@@ -201,7 +200,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
/////////////////////////ULSCH modulation/////////////////////////
///////////
- int max_num_re = number_of_symbols*nb_rb*NR_NB_SC_PER_RB;
+ int max_num_re = Nl*number_of_symbols*nb_rb*NR_NB_SC_PER_RB;
int32_t d_mod[max_num_re] __attribute__ ((aligned(16)));
nr_modulation(scrambled_output, // assume one codeword for the moment
@@ -209,7 +208,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
mod_order,
(int16_t *)d_mod);
-
///////////
////////////////////////////////////////////////////////////////////////
@@ -284,8 +282,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
/// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
int32_t y[max_num_re] __attribute__ ((aligned(16)));
- // if transform precoding is enbaled (value 0)
- if (pusch_pdu->transform_precoding == 0) {
+ if (pusch_pdu->transform_precoding == transformPrecoder_enabled) {
uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB;
uint32_t y_offset = 0;
@@ -315,20 +312,20 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset);
#ifdef DEBUG_PUSCH_MAPPING
- printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
- y_offset, nb_re_pusch, l, nb_rb);
+ printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
+ y_offset, nb_re_pusch, l, nb_rb);
#endif
}
#ifdef DEBUG_DFT_IDFT
- int32_t debug_symbols[max_num_re] __attribute__ ((aligned(16)));
+ int32_t debug_symbols[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
int offset = 0;
printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order);
for (int ll = 0; ll < (available_bits/mod_order); ll++) {
- debug_symbols[ll] = y[ll];
+ debug_symbols[ll] = ulsch_ue->y[ll];
}
-
+
printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols);
for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {
nr_idft(&debug_symbols[offset], nb_re_pusch);
@@ -341,32 +338,33 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
#endif
}
- else
- memcpy(y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t));
- for (int nl = 0; nl < Nl; nl++)
- free_and_zero(tx_layers[nl]);
- free_and_zero(tx_layers);
+ ///////////
+ ////////////////////////////////////////////////////////////////////////
+
+
/////////////////////////ULSCH RE mapping/////////////////////////
///////////
- txdataF = UE->common_vars.txdataF;
-
- for (ap=0; ap< Nl; ap++) {
+ int encoded_length = frame_parms->N_RB_UL*14*NR_NB_SC_PER_RB*mod_order*Nl;
+ int16_t **tx_precoding = (int16_t **)malloc16_clear(Nl*sizeof(int16_t *));
+ for (int nl=0; nlNid_cell, u);
#endif
- // DMRS params for this ap
- get_Wt(Wt, ap, dmrs_type);
- get_Wf(Wf, ap, dmrs_type);
- delta = get_delta(ap, dmrs_type);
+ int dmrs_port = get_dmrs_port(nl,pusch_pdu->dmrs_ports);
+ // DMRS params for this dmrs port
+ get_Wt(Wt, dmrs_port, dmrs_type);
+ get_Wf(Wf, dmrs_port, dmrs_type);
+ delta = get_delta(dmrs_port, dmrs_type);
for (int l=start_symbol; l> l) & 0x01) {
is_dmrs_sym = 1;
- // transform precoding disabled (value 1)
- if (pusch_pdu->transform_precoding == 1){
+ if (pusch_pdu->transform_precoding == transformPrecoder_disabled){
if (dmrs_type == pusch_dmrs_type1)
dmrs_idx = (pusch_pdu->bwp_start + start_rb)*6;
@@ -396,7 +393,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
}
} else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
- AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
+ AssertFatal(pusch_pdu->transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols)) {
is_ptrs_sym = 1;
@@ -405,7 +402,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
}
for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) {
-
uint8_t is_dmrs = 0;
uint8_t is_ptrs = 0;
@@ -417,7 +413,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
} else if (is_ptrs_sym) {
is_ptrs = is_ptrs_subcarrier(k,
rnti,
- ap,
+ nl,
dmrs_type,
K_ptrs,
nb_rb,
@@ -428,67 +424,146 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
if (is_dmrs == 1) {
// if transform precoding is enabled
- if (pusch_pdu->transform_precoding == 0) {
-
- ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
-
+ if (pusch_pdu->transform_precoding == transformPrecoder_enabled) {
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
} else {
-
- ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
-
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
}
#ifdef DEBUG_PUSCH_MAPPING
- printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
- dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
+ printf("DMRS: Layer: %d\t, dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
+ nl, dmrs_idx, l, k, k_prime, n, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1],
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]);
#endif
-
dmrs_idx++;
k_prime++;
k_prime&=1;
n+=(k_prime)?0:1;
-
+
} else if (is_ptrs == 1) {
-
- ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15;
-
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15;
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15;
ptrs_idx++;
-
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
-
- ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1];
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1];
+ if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = ((int16_t *)tx_layers[nl])[m<<1];
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *)tx_layers[nl])[(m<<1) + 1];
+ }
+ else {
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1];
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1];
+ }
#ifdef DEBUG_PUSCH_MAPPING
- printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
- m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
+ printf("DATA: layer %d\t m %d\t l %d \t k %d \t tx_precoding: %d %d\n",
+ nl, m, l, k, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1],
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]);
#endif
m++;
} else {
-
- ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = 0;
- ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = 0;
-
+ ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = 0;
+ ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = 0;
}
if (++k >= frame_parms->ofdm_symbol_size)
k -= frame_parms->ofdm_symbol_size;
- }
- }
- }
+ } //for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++)
+ }//for (l=start_symbol; lnb_antennas_tx; ap++) {
+ for (int l=start_symbol; lTpmi;
+
+ if (pmi == 0) {//unitary Precoding
+ if(ap< pusch_pdu->nrOfLayers)
+ memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + k],
+ (void*)&tx_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + k)],
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+ else
+ memset((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + k],
+ 0,
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+
+ k += NR_NB_SC_PER_RB;
+ if (k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ else {
+ //get the precoding matrix weights:
+ char *W_prec;
+ switch (frame_parms->nb_antennas_tx) {
+ case 1://1 antenna port
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ case 2://2 antenna ports
+ if (pusch_pdu->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_2p[pmi][ap];
+ else//2 layers
+ W_prec = nr_W_2l_2p[pmi][ap];
+ break;
+ case 4://4 antenna ports
+ if (pusch_pdu->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_4p[pmi][ap];
+ else if (pusch_pdu->nrOfLayers == 2)//2 layers
+ W_prec = nr_W_2l_4p[pmi][ap];
+ else if (pusch_pdu->nrOfLayers == 3)//3 layers
+ W_prec = nr_W_3l_4p[pmi][ap];
+ else//4 layers
+ W_prec = nr_W_4l_4p[pmi][ap];
+ break;
+ default:
+ LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n");
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ }
+
+ for (int i=0; iofdm_symbol_size + k;
+ int32_t precodatatx_F = nr_layer_precoder(tx_precoding, W_prec, pusch_pdu->nrOfLayers, re_offset);
+ ((int16_t*)txdataF[ap])[(re_offset<<1)] = ((int16_t *) &precodatatx_F)[0];
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + 1] = ((int16_t *) &precodatatx_F)[1];
+
+ if (++k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ }
+ } //RB loop
+ } // symbol loop
+ }// port loop
NR_UL_UE_HARQ_t *harq_process_ulsch=NULL;
harq_process_ulsch = UE->ulsch[thread_id][gNB_id]->harq_processes[harq_pid];
harq_process_ulsch->status = SCH_IDLE;
+ for (int nl = 0; nl < Nl; nl++) {
+ free_and_zero(tx_layers[nl]);
+ free_and_zero(tx_precoding[nl]);
+ }
+ free_and_zero(tx_layers);
+ free_and_zero(tx_precoding);
+
///////////
////////////////////////////////////////////////////////////////////////
@@ -498,7 +573,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
uint8_t slot,
NR_DL_FRAME_PARMS *frame_parms,
- uint8_t Nl) {
+ uint8_t n_antenna_ports) {
int tx_offset, ap;
int32_t **txdata;
@@ -520,7 +595,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
txdataF = UE->common_vars.txdataF;
int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
- for(ap = 0; ap < Nl; ap++) {
+ for(ap = 0; ap < n_antenna_ports; ap++) {
for (int s=0;s (%d.%d)\n",
@@ -538,7 +613,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
}
}
- for (ap = 0; ap < Nl; ap++) {
+ for (ap = 0; ap < n_antenna_ports; ap++) {
if (frame_parms->Ncp == 1) { // extended cyclic prefix
PHY_ofdm_mod(txdataF[ap],
&txdata[ap][tx_offset],
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index 13ed436273..d2034f3abf 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -48,126 +48,8 @@
#include "PHY/NR_REFSIG/sss_nr.h"
#include "PHY/NR_UE_TRANSPORT/cic_filter_nr.h"
-/*******************************************************************
-*
-* NAME : get_idft
-*
-* PARAMETERS : size of ofdm symbol
-*
-* RETURN : index pointing to the dft func in the dft library
-*
-* DESCRIPTION : get idft function depending of ofdm size
-*
-*********************************************************************/
-
//#define DBG_PSS_NR
-idft_size_idx_t get_idft(int ofdm_symbol_size)
-{
-
-
- switch (ofdm_symbol_size) {
- case 128:
- return IDFT_128;
- break;
-
- case 256:
- return IDFT_256;
- break;
-
- case 512:
- return IDFT_512;
- break;
-
- case 1024:
- return IDFT_1024;
- break;
-
- case 1536:
- return IDFT_1536;
- break;
-
- case 2048:
- return IDFT_2048;
- break;
-
- case 3072:
- return IDFT_3072;
- break;
-
- case 4096:
- return IDFT_4096;
- break;
-
- case 8192:
- return IDFT_8192;
- break;
-
- default:
- printf("function get_idft : unsupported ofdm symbol size \n");
- assert(0);
- break;
- }
- return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function
-}
-
-/*******************************************************************
-*
-* NAME : get_dft
-*
-* PARAMETERS : size of ofdm symbol
-*
-* RETURN : function for discrete fourier transform
-*
-* DESCRIPTION : get dft function depending of ofdm size
-*
-*********************************************************************/
-
-dft_size_idx_t get_dft(int ofdm_symbol_size)
-{
-
-
- switch (ofdm_symbol_size) {
- case 128:
- return DFT_128;
- break;
-
- case 256:
- return DFT_256;
- break;
-
- case 512:
- return DFT_512;
- break;
-
- case 1024:
- return DFT_1024;
- break;
-
- case 1536:
- return DFT_1536;
- break;
-
- case 2048:
- return DFT_2048;
- break;
-
- case 4096:
- return DFT_4096;
- break;
-
- case 8192:
- return DFT_8192;
- break;
-
- default:
- printf("function get_dft : unsupported ofdm symbol size \n");
- assert(0);
- break;
- }
- return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function;
-}
-
/*******************************************************************
*
* NAME : generate_pss_nr
diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c
index 9b3f65d7d1..2c45437cdf 100644
--- a/openair1/PHY/TOOLS/lte_ue_scope.c
+++ b/openair1/PHY/TOOLS/lte_ue_scope.c
@@ -51,9 +51,9 @@ void reset_stats(FL_OBJECT *button, long arg) {
int i,j,k;
PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
- for (i=0; idlsch[i][0]->Mlimit; j++) {
+ for (i=0; idlsch[k][0]->Mlimit; j++) {
phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index 145fbe4a31..839beb3dc9 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -33,7 +33,9 @@
extern "C" {
#endif
+#include
#include
+#include
#include "PHY/sse_intrin.h"
#define CEILIDIV(a,b) ((a+b-1)/b)
@@ -315,6 +317,65 @@ typedef enum dft_size_idx {
#define SZ_iENUM(Sz) IDFT_ ## Sz,
+/*******************************************************************
+*
+* NAME : get_dft
+*
+* PARAMETERS : size of ofdm symbol
+*
+* RETURN : function for discrete fourier transform
+*
+* DESCRIPTION : get dft function depending of ofdm size
+*
+*********************************************************************/
+static inline
+dft_size_idx_t get_dft(int ofdm_symbol_size)
+{
+ switch (ofdm_symbol_size) {
+ case 128:
+ return DFT_128;
+ case 256:
+ return DFT_256;
+ case 512:
+ return DFT_512;
+ case 1024:
+ return DFT_1024;
+ case 1536:
+ return DFT_1536;
+ case 2048:
+ return DFT_2048;
+ case 3072:
+ return DFT_3072;
+ case 4096:
+ return DFT_4096;
+ case 6144:
+ return DFT_6144;
+ case 8192:
+ return DFT_8192;
+ case 9216:
+ return DFT_9216;
+ case 12288:
+ return DFT_12288;
+ case 18432:
+ return DFT_18432;
+ case 24576:
+ return DFT_24576;
+ case 36864:
+ return DFT_36864;
+ case 49152:
+ return DFT_49152;
+ case 73728:
+ return DFT_73728;
+ case 98304:
+ return DFT_98304;
+ default:
+ printf("function get_dft : unsupported ofdm symbol size \n");
+ assert(0);
+ break;
+ }
+ return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function;
+}
+
typedef enum idft_size_idx {
FOREACH_IDFTSZ(SZ_iENUM)
IDFT_SIZE_IDXTABLESIZE
@@ -340,6 +401,64 @@ struct {
#endif
+/*******************************************************************
+*
+* NAME : get_idft
+*
+* PARAMETERS : size of ofdm symbol
+*
+* RETURN : index pointing to the dft func in the dft library
+*
+* DESCRIPTION : get idft function depending of ofdm size
+*
+*********************************************************************/
+static inline
+idft_size_idx_t get_idft(int ofdm_symbol_size)
+{
+ switch (ofdm_symbol_size) {
+ case 128:
+ return IDFT_128;
+ case 256:
+ return IDFT_256;
+ case 512:
+ return IDFT_512;
+ case 1024:
+ return IDFT_1024;
+ case 1536:
+ return IDFT_1536;
+ case 2048:
+ return IDFT_2048;
+ case 3072:
+ return IDFT_3072;
+ case 4096:
+ return IDFT_4096;
+ case 6144:
+ return IDFT_6144;
+ case 8192:
+ return IDFT_8192;
+ case 9216:
+ return IDFT_9216;
+ case 12288:
+ return IDFT_12288;
+ case 18432:
+ return IDFT_18432;
+ case 24576:
+ return IDFT_24576;
+ case 36864:
+ return IDFT_36864;
+ case 49152:
+ return IDFT_49152;
+ case 73728:
+ return IDFT_73728;
+ case 98304:
+ return IDFT_98304;
+ default:
+ printf("function get_idft : unsupported ofdm symbol size \n");
+ assert(0);
+ break;
+ }
+ return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function
+}
/*!\fn int32_t rotate_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N,uint16_t output_shift)
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index ec9c42256b..ace4cf120b 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -271,7 +271,7 @@ typedef struct {
/// The payload + CRC (24 bits) in bits (38.212 V15.4.0 section 5.1)
uint32_t B;
/// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2)
- uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
+ uint8_t **c;
/// Number of bits in each code block (38.212 V15.4.0 section 5.2.2)
uint32_t K;
/// Number of "Filler" bits added in the code block segmentation (38.212 V15.4.0 section 5.2.2)
@@ -279,11 +279,9 @@ typedef struct {
/// Number of code blocks after code block segmentation (38.212 V15.4.0 section 5.2.2)
uint32_t C;
/// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
- int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
+ int16_t **d;
/// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1)
uint32_t Z;
- /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
- int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448];
/// Number of bits in each code block after rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
uint32_t E;
/// Number of segments processed so far
@@ -338,8 +336,6 @@ typedef struct {
int16_t q_RI[MAX_RI_PAYLOAD];
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
uint8_t h[MAX_NUM_CHANNEL_BITS];
- /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
- int16_t *w[MAX_NUM_NR_ULSCH_SEGMENTS];
//////////////////////////////////////////////////////////////
} NR_UL_gNB_HARQ_t;
@@ -432,10 +428,6 @@ typedef struct {
/// - first index: rx antenna id [0..nb_antennas_rx[
/// - second index: ? [0..2*ofdm_symbol_size[
int32_t **rxdataF_ext;
- /// \brief Holds the received data in the frequency domain for the allocated RBs in normal format.
- /// - first index: rx antenna id [0..nb_antennas_rx[
- /// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
- int32_t **rxdataF_ext2;
/// \brief Hold the channel estimates in time domain based on DRS.
/// - first index: rx antenna id [0..nb_antennas_rx[
/// - second index: ? [0..4*ofdm_symbol_size[
@@ -448,14 +440,6 @@ typedef struct {
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
int32_t **ul_ch_estimates_ext;
- /// \brief Hold the PTRS phase estimates in frequency domain.
- /// - first index: rx antenna id [0..nb_antennas_rx[
- /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
- int32_t **ul_ch_ptrs_estimates;
- /// \brief Uplink phase estimates extracted in PRBS.
- /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
- /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
- int32_t **ul_ch_ptrs_estimates_ext;
/// \brief Holds the compensated signal.
/// - first index: rx antenna id [0..nb_antennas_rx[
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
@@ -471,7 +455,7 @@ typedef struct {
/// \brief Cross-correlation of two UE signals.
/// - first index: rx antenna [0..nb_antennas_rx[
/// - second index: symbol [0..]
- int32_t **rho;
+ int32_t ***rho;
/// \f$\log_2(\max|H_i|^2)\f$
int16_t log2_maxh;
/// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level).
@@ -501,6 +485,10 @@ typedef struct {
/// \brief llr values.
/// - first index: ? [0..1179743] (hard coded)
int16_t *llr;
+ /// \brief llr values per layer.
+ /// - first index: ? [0..3] (hard coded)
+ /// - first index: ? [0..1179743] (hard coded)
+ int16_t **llr_layers;
/// DMRS symbol index, to be updated every DMRS symbol within a slot.
uint8_t dmrs_symbol;
// PTRS symbol index, to be updated every PTRS symbol within a slot.
@@ -775,6 +763,9 @@ typedef struct PHY_VARS_gNB_s {
/// SRS variables
nr_srs_info_t *nr_srs_info[NUMBER_OF_NR_SRS_MAX];
+ /// CSI-RS variables
+ nr_csi_rs_info_t *nr_csi_rs_info;
+
uint8_t pbch_configured;
char gNB_generate_rar;
@@ -806,9 +797,6 @@ typedef struct PHY_VARS_gNB_s {
// Mask of occupied RBs, per symbol and PRB
uint32_t rb_mask_ul[14][9];
- /// CSI RS sequence
- uint32_t ***nr_gold_csi_rs;
-
/// Indicator set to 0 after first SR
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
@@ -845,7 +833,6 @@ typedef struct PHY_VARS_gNB_s {
/// counter to average prach energh over first 100 prach opportunities
int prach_energy_counter;
- int csi_gold_init;
int pdcch_gold_init;
int pdsch_gold_init[2];
int pusch_gold_init[2];
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 79130ee107..e18e7e982e 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -276,10 +276,6 @@ typedef struct {
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_estimates_ext;
- /// \brief Downlink channel estimates extracted in PRBS.
- /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
- /// - second index: ? [0..168*N_RB_DL[
- int32_t **dl_ch_ptrs_estimates_ext;
/// \brief Downlink beamforming channel estimates in frequency domain.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
@@ -595,6 +591,16 @@ typedef struct {
fapi_nr_ul_config_prach_pdu prach_pdu;
} NR_UE_PRACH;
+typedef struct {
+ bool active;
+ fapi_nr_dl_config_csiim_pdu_rel15_t csiim_config_pdu;
+} NR_UE_CSI_IM;
+
+typedef struct {
+ bool active;
+ fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu;
+} NR_UE_CSI_RS;
+
typedef struct {
bool active;
fapi_nr_ul_config_srs_pdu srs_config_pdu;
@@ -708,6 +714,8 @@ typedef struct {
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX];
+ NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX];
+ NR_UE_CSI_RS *csirs_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_LAYERS>4 ? 2:1]; // two RxTx Threads
@@ -866,6 +874,9 @@ typedef struct {
/// SRS variables
nr_srs_info_t *nr_srs_info;
+ /// CSI-RS variables
+ nr_csi_rs_info_t *nr_csi_rs_info;
+
//#if defined(UPGRADE_RAT_NR)
#if 1
SystemInformationBlockType1_nr_t systemInformationBlockType1_nr;
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index b24abd7de3..9c8e90a9c7 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -79,16 +79,21 @@
#define NR_MAX_CSET_DURATION 3
#define NR_MAX_NB_RBG 18
+
#define NR_MAX_NB_LAYERS 4 // 8
+#define NR_MAX_NB_PORTS 32
+
#define NR_MAX_NB_HARQ_PROCESSES 16
#define NR_MAX_PDSCH_TBS 3824
#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.
-#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 34
+#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36
-#define MAX_NUM_NR_ULSCH_SEGMENTS 34
-#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
+#define MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER 34
+
+#define MAX_NUM_NR_CHANNEL_BITS (4*14*273*12*8) // 14 symbols, 273 RB
+#define MAX_NUM_NR_RE (4*14*273*12)
#define MAX_NUM_NR_SRS_SYMBOLS 4
@@ -247,6 +252,25 @@ typedef struct {
uint32_t *noise_power;
} nr_srs_info_t;
+typedef struct {
+ uint8_t N_cdm_groups;
+ uint8_t CDM_group_size;
+ uint8_t kprime;
+ uint8_t lprime;
+ uint8_t N_ports;
+ uint8_t j[16];
+ uint8_t koverline[16];
+ uint8_t loverline[16];
+ uint16_t csi_gold_init;
+ uint32_t ***nr_gold_csi_rs;
+ uint8_t csi_rs_generated_signal_bits;
+ int32_t **csi_rs_generated_signal;
+ int32_t **csi_rs_received_signal;
+ int32_t ***csi_rs_ls_estimated_channel;
+ int32_t ***csi_rs_estimated_channel_freq;
+ uint32_t *noise_power;
+} nr_csi_rs_info_t;
+
typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS;
typedef uint32_t (*get_samples_per_slot_t)(int slot, NR_DL_FRAME_PARMS* fp);
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index b90f14a129..3d5e4a0ce4 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -526,7 +526,8 @@ void nr_fep0(RU_t *ru, int first_half) {
end_symbol = NR_SYMBOLS_PER_SLOT;
}
- LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d\n", proc->tti_rx, first_half, start_symbol, end_symbol);
+ LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d, nb_antennas_rx = %d,N_TA_offset = %d\n",
+ proc->tti_rx, first_half, start_symbol, end_symbol,fp->nb_antennas_rx,ru->N_TA_offset);
// printf("fep0: slot %d\n",slot);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+proc->tti_rx, 1);
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index dca97bddf0..9c607cb8b7 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -178,8 +178,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[i];
if (csirs->active == 1) {
LOG_D(PHY, "CSI-RS generation started in frame %d.%d\n",frame,slot);
- nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params = csirs->csirs_pdu.csi_rs_pdu_rel15;
- nr_generate_csi_rs(gNB, AMP, csi_params, slot);
+ nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params = &csirs->csirs_pdu.csi_rs_pdu_rel15;
+ nr_generate_csi_rs(gNB->frame_parms, gNB->common_vars.txdataF, AMP, gNB->nr_csi_rs_info, csi_params, slot);
csirs->active = 0;
}
}
@@ -346,6 +346,14 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
pusch_pdu->qam_mod_order,
pusch_pdu->nrOfLayers);
+
+
+ nr_ulsch_layer_demapping(gNB->pusch_vars[ULSCH_id]->llr,
+ pusch_pdu->nrOfLayers,
+ pusch_pdu->qam_mod_order,
+ G,
+ gNB->pusch_vars[ULSCH_id]->llr_layers);
+
//----------------------------------------------------------
//------------------- ULSCH unscrambling -------------------
//----------------------------------------------------------
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index 9bcf659eac..7672aee8a2 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -373,6 +373,7 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx);
int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
+bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol);
/*! \brief This function prepares the dl indication to pass to the MAC
@param
@@ -427,6 +428,9 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
int n_ss);
+int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id);
+
+int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id);
#endif
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index f8eef9a8c2..046f67a7d0 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -44,7 +44,7 @@
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
-const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH"};
+const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM"};
const char *ul_pdu_type[]={"PRACH", "PUCCH", "PUSCH", "SRS"};
queue_t nr_rx_ind_queue;
queue_t nr_crc_ind_queue;
@@ -315,6 +315,9 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0,
dlsch0_harq->mcs = dlsch_config_pdu->mcs;
dlsch0_harq->rvidx = dlsch_config_pdu->rv;
dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH;
+ dlsch0_harq->R = dlsch_config_pdu->targetCodeRate;
+ dlsch0_harq->Qm = dlsch_config_pdu->qamModOrder;
+ dlsch0_harq->TBS = dlsch_config_pdu->TBS;
dlsch0_harq->tbslbrm = dlsch_config_pdu->tbslbrm;
dlsch0_harq->nscid = dlsch_config_pdu->nscid;
dlsch0_harq->dlDmrsScramblingId = dlsch_config_pdu->dlDmrsScramblingId;
@@ -357,12 +360,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
NR_UE_DLSCH_t *dlsch0 = NULL;
NR_UE_ULSCH_t *ulsch = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0];
NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0];
+ NR_UE_CSI_IM *csiim_vars = PHY_vars_UE_g[module_id][cc_id]->csiim_vars[0];
+ NR_UE_CSI_RS *csirs_vars = PHY_vars_UE_g[module_id][cc_id]->csirs_vars[0];
NR_UE_PDCCH_CONFIG *phy_pdcch_config = NULL;
if(scheduled_response->dl_config != NULL){
fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu;
fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config;
+ fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu;
+ fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu;
for (int i = 0; i < dl_config->number_pdus; ++i){
AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus);
@@ -384,10 +391,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
LOG_D(PHY,"Number of DCI SearchSpaces %d\n",phy_pdcch_config->nb_search_space);
break;
case FAPI_NR_DL_CONFIG_TYPE_CSI_IM:
- LOG_I(PHY,"Received CSI-IM PDU at FAPI\n");
+ csiim_config_pdu = &dl_config->dl_config_list[i].csiim_config_pdu.csiim_config_rel15;
+ memcpy((void*)&(csiim_vars->csiim_config_pdu), (void*)csiim_config_pdu, sizeof(fapi_nr_dl_config_csiim_pdu_rel15_t));
+ csirs_vars->active = true;
break;
case FAPI_NR_DL_CONFIG_TYPE_CSI_RS:
- LOG_I(PHY,"Received CSI-RS PDU at FAPI\n");
+ csirs_config_pdu = &dl_config->dl_config_list[i].csirs_config_pdu.csirs_config_rel15;
+ memcpy((void*)&(csirs_vars->csirs_config_pdu), (void*)csirs_config_pdu, sizeof(fapi_nr_dl_config_csirs_pdu_rel15_t));
+ csirs_vars->active = true;
break;
case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH:
dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15;
@@ -426,7 +437,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
for (int i = 0; i < ul_config->number_pdus; ++i){
AssertFatal(ul_config->ul_config_list[i].pdu_type <= FAPI_NR_UL_CONFIG_TYPES,"pdu_type %d out of bounds\n",ul_config->ul_config_list[i].pdu_type);
- LOG_D(PHY, "In %s: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config);
+ LOG_D(PHY, "In %s i %d: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, i, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config);
uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, current_harq_pid, gNB_id = 0;
/* PRACH */
@@ -451,6 +462,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
if (harq_process_ul_ue){
nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu;
+
+ LOG_D(PHY, "In %s i %d: copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", __FUNCTION__, i, pusch_config_pdu->nrOfLayers,pusch_config_pdu->num_dmrs_cdm_grps_no_data);
memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t));
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 9db3dcafd1..bbc12e4ac5 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -135,7 +135,6 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
trace_NRpdu(DIRECTION_DOWNLINK,
dlsch0->harq_processes[dlsch0->current_harq_pid]->b,
dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8,
- pdu_type,
WS_C_RNTI,
dlsch0->rnti,
proc->frame_rx,
@@ -285,7 +284,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
- memset(ue->common_vars.txdataF[0], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
+ for(int i=0; i< ue->frame_parms.nb_antennas_tx; ++i)
+ memset(ue->common_vars.txdataF[i], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
@@ -804,8 +804,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
nb_symb_sch,
nr_slot_rx,
harq_pid,
- pdsch==PDSCH?1:0,
- dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+ pdsch==PDSCH);
LOG_T(PHY,"dlsch decoding, ret = %d\n", ret);
@@ -881,8 +880,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
nb_symb_sch,
nr_slot_rx,
harq_pid,
- pdsch==PDSCH?1:0,//proc->decoder_switch,
- dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+ pdsch==PDSCH);//proc->decoder_switch
LOG_T(PHY,"CW dlsch decoding, ret1 = %d\n", ret1);
stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
@@ -921,21 +919,25 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
const double N_TA_max = Ta_max * bw_scaling * tc_factor;
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+ NR_BWP_Id_t dl_bwp = mac->DL_BWP_Id;
+ NR_BWP_Id_t ul_bwp = mac->UL_BWP_Id;
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
- if (mac->ULbwp[0] &&
- mac->ULbwp[0]->bwp_Dedicated &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
- }
- else if (mac->ULbwp[0] &&
- mac->ULbwp[0]->bwp_Common &&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon &&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ if(ul_bwp){
+ if (mac->ULbwp[ul_bwp-1] &&
+ mac->ULbwp[ul_bwp-1]->bwp_Dedicated &&
+ mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config &&
+ mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup &&
+ mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
+ pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
+ }
+ else if (mac->ULbwp[ul_bwp-1] &&
+ mac->ULbwp[ul_bwp-1]->bwp_Common &&
+ mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon &&
+ mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
+ mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+ pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ }
}
else if (mac->scc_SIB &&
mac->scc_SIB->uplinkConfigCommon &&
@@ -946,12 +948,15 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
- NR_PDSCH_Config_t *pdsch_Config = (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+ NR_PDSCH_Config_t *pdsch_Config = NULL;
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
- if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
- else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ if(dl_bwp){
+ pdsch_Config = (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+ if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
+ pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
+ else if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
+ pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ }
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
@@ -1005,7 +1010,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
d_2_1 = 1;
/* d_2_2 */
- const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
+ const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1];
/* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
// N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
@@ -1615,6 +1620,23 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
+ // do procedures for CSI-IM
+ if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) {
+ nr_ue_csi_im_procedures(ue, proc, gNB_id);
+ ue->csiim_vars[gNB_id]->active = 0;
+ }
+
+ // do procedures for CSI-RS
+ if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) {
+ for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
+ if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu,symb)) {
+ nr_slot_fep(ue, proc, symb, nr_slot_rx);
+ }
+ }
+ nr_ue_csi_rs_procedures(ue, proc, gNB_id);
+ ue->csirs_vars[gNB_id]->active = 0;
+ }
+
start_meas(&ue->generic_stat);
if (nr_slot_rx==9) {
diff --git a/openair1/SCHED_NR_UE/phy_sch_processing_time.h b/openair1/SCHED_NR_UE/phy_sch_processing_time.h
index 1962df22ee..81cc4496a2 100644
--- a/openair1/SCHED_NR_UE/phy_sch_processing_time.h
+++ b/openair1/SCHED_NR_UE/phy_sch_processing_time.h
@@ -106,4 +106,36 @@ float pusch_N_2_timing_capability_2[3][2] = {
{ 0, 5 },
{ 1, 5.5 },
{ 2, 11 },
-};
\ No newline at end of file
+};
+
+/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 1
+// corresponding to the PUSCH preparation time d_2_2 [slots]
+// where mu corresponds to the one of {mu_DL, mu_UL}
+// resulting with the largest T_proc_2
+// where mu_DL is the SCS with which the PDCCH
+// carrying the DCI scheduling the PUSCH was transmitted
+// mu_UL is the SCS of the UL channel with which PUSCH to be transmitted
+*/
+float pusch_d_2_2_timing_capability_1[4][2] = {
+/* mu d_2_2 */
+{ 0, 1 },
+{ 1, 2 },
+{ 2, 3 },
+{ 3, 6 },
+};
+
+/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 2
+// corresponding to the PUSCH preparation time d_2_2 [slots]
+// where mu corresponds to the one of {mu_DL, mu_UL}
+// resulting with the largest T_proc_2
+// where mu_DL is the SCS with which the PDCCH
+// carrying the DCI scheduling the PUSCH was transmitted
+// mu_UL is the SCS of the UL channel with which PUSCH to be transmitted
+*/
+float pusch_d_2_2_timing_capability_2[4][2] = {
+/* mu d_2_2 */
+{ 0, 3 },
+{ 1, 5 },
+{ 2, 9 },
+{ 3, 18 },
+};
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index a14a1ff3c6..e81871b146 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -47,14 +47,18 @@
#include "openair1/SIMULATION/RF/rf.h"
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
+
//#define DEBUG_NR_DLSCHSIM
+THREAD_STRUCT thread_struct;
PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE;
RAN_CONTEXT_t RC;
UE_nr_rxtx_proc_t proc;
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
double cpuf;
//uint8_t nfapi_mode = 0;
@@ -427,13 +431,10 @@ int main(int argc, char **argv)
NR_gNB_DLSCH_t *dlsch = msgDataTx.dlsch[0][0];
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_process.pdsch_pdu.pdsch_pdu_rel15;
//time_stats_t *rm_stats, *te_stats, *i_stats;
- uint8_t is_crnti = 0, llr8_flag = 0;
+ uint8_t is_crnti = 0;
unsigned int TBS = 8424;
- unsigned int available_bits;
uint8_t nb_re_dmrs = 6; // No data in dmrs symbol
uint16_t length_dmrs = 1;
- unsigned char mod_order;
- uint16_t rate;
uint8_t Nl = 1;
uint8_t rvidx = 0;
dlsch->rnti = 1;
@@ -441,9 +442,9 @@ int main(int argc, char **argv)
dlsch->harq_processes[0]->rvidx = rvidx;*/
//printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe],
// dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl);
- mod_order = nr_get_Qm_dl(Imcs, mcs_table);
- rate = nr_get_code_rate_dl(Imcs, mcs_table);
- available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
+ unsigned char mod_order = nr_get_Qm_dl(Imcs, mcs_table);
+ uint16_t rate = nr_get_code_rate_dl(Imcs, mcs_table);
+ unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
TBS = nr_compute_tbs(mod_order,rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl);
printf("available bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order);
//dlsch->harq_ids[subframe]= 0;
@@ -475,6 +476,7 @@ int main(int argc, char **argv)
harq_process->Qm = mod_order;
harq_process->rvidx = rvidx;
harq_process->R = rate;
+ harq_process->TBS = TBS;
harq_process->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
harq_process->dlDmrsSymbPos = 4;
harq_process->n_dmrs_cdm_groups = 1;
@@ -495,8 +497,8 @@ int main(int argc, char **argv)
//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32));
// generate signal
- unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32)));
- bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
+ unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32)));
+ bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
if (input_fd == NULL) {
nr_dlsch_encoding(gNB, frame, slot, &dlsch->harq_process, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
@@ -548,7 +550,7 @@ int main(int argc, char **argv)
ret = nr_dlsch_decoding(UE, &proc, 0, channel_output_fixed, &UE->frame_parms,
dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
- slot,harq_pid, is_crnti, llr8_flag);
+ slot,harq_pid, is_crnti);
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_OUT);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index eff65fa606..99236c9a43 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -96,7 +96,6 @@ uint16_t sl_ahead=0;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
THREAD_STRUCT thread_struct;
nfapi_ue_release_request_body_t release_rntis;
-uint32_t N_RB_DL = 106;
//Fixme: Uniq dirty DU instance, by global var, datamodel need better management
instance_t DUuniqInstance=0;
instance_t CUuniqInstance=0;
@@ -211,10 +210,9 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
void config_common(int Mod_idP,
int ssb_SubcarrierOffset,
- rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
+ int pdsch_AntennaPorts,
int pusch_AntennaPorts,
- NR_ServingCellConfigCommon_t *scc
- );
+ NR_ServingCellConfigCommon_t *scc);
int generate_dlsch_header(unsigned char *mac_header,
unsigned char num_sdus,
@@ -271,9 +269,9 @@ int g_mcsIndex = -1, g_mcsTableIdx = 0, g_rbStart = -1, g_rbSize = -1, g_nrOfLay
void nr_dlsim_preprocessor(module_id_t module_id,
frame_t frame,
sub_frame_t slot) {
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
- AssertFatal(UE_info->num_UEs == 1, "can have only a single UE\n");
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[0];
+ NR_UE_info_t *UE_info = RC.nrmac[module_id]->UE_info.list[0];
+ AssertFatal(RC.nrmac[module_id]->UE_info.list[1]==NULL, "can have only a single UE\n");
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl;
NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
/* manually set free CCE to 0 */
@@ -283,17 +281,17 @@ void nr_dlsim_preprocessor(module_id_t module_id,
find_aggregation_candidates(&sched_ctrl->aggregation_level,
&nr_of_candidates,
sched_ctrl->search_space,4);
- sched_ctrl->coreset = get_coreset(module_id, scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss);
+ sched_ctrl->coreset = get_coreset(RC.nrmac[module_id], scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss);
sched_ctrl->cce_index = 0;
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
nr_set_pdsch_semi_static(NULL,
scc,
- UE_info->CellGroup[0],
+ UE_info->CellGroup,
sched_ctrl->active_bwp,
NULL,
- /* tda = */ 2,
+ /* tda = */ 0,
g_nrOfLayers,
sched_ctrl,
ps);
@@ -315,8 +313,7 @@ void nr_dlsim_preprocessor(module_id_t module_id,
ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
0 /* N_PRB_oh, 0 for initialBWP */,
0 /* tb_scaling */,
- ps->nrOfLayers)
- >> 3;
+ ps->nrOfLayers) >> 3;
/* the simulator assumes the HARQ PID is equal to the slot number */
sched_pdsch->dl_harq_pid = slot;
@@ -652,15 +649,15 @@ int main(int argc, char **argv)
dmrs_arg[i] = atoi(argv[optind++]);
}
break;
-
+
case 'X':
strncpy(gNBthreads, optarg, sizeof(gNBthreads));
gNBthreads[sizeof(gNBthreads)-1]=0;
break;
-
+
default:
case 'h':
- printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
+ printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
argv[0]);
printf("-h This message\n");
printf("-L \n");
@@ -669,7 +666,7 @@ int main(int argc, char **argv)
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
- printf("-t Delay spread for multipath channel\n");
+ //printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
printf("-y Number of TX antennas used in gNB\n");
printf("-z Number of RX antennas used in UE\n");
@@ -839,8 +836,7 @@ int main(int argc, char **argv)
gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
phy_init_nr_gNB(gNB,0,1);
N_RB_DL = gNB->frame_parms.N_RB_DL;
- NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
- UE_info->num_UEs=1;
+ NR_UE_info_t *UE_info = RC.nrmac[0]->UE_info.list[0];
// stub to configure frame_parms
// nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
@@ -855,10 +851,14 @@ int main(int argc, char **argv)
double fs,bw;
- if (mu == 1 && N_RB_DL == 217) {
+ if (mu == 0 && N_RB_DL == 25) {
+ fs = 7.68e6;
+ bw = 5e6;
+ }
+ else if (mu == 1 && N_RB_DL == 217) {
fs = 122.88e6;
bw = 80e6;
- }
+ }
else if (mu == 1 && N_RB_DL == 245) {
fs = 122.88e6;
bw = 90e6;
@@ -871,14 +871,18 @@ int main(int argc, char **argv)
fs = 61.44e6;
bw = 40e6;
}
- else if (mu == 1 && N_RB_DL == 133) {
+ else if (mu == 1 && N_RB_DL == 133) {
fs = 61.44e6;
bw = 50e6;
}
- else if (mu == 1 && N_RB_DL == 162) {
+ else if (mu == 1 && N_RB_DL == 162) {
fs = 61.44e6;
bw = 60e6;
}
+ else if (mu == 1 && N_RB_DL == 24) {
+ fs = 15.36e6;
+ bw = 10e6;
+ }
else if (mu == 3 && N_RB_DL == 66) {
fs = 122.88e6;
bw = 100e6;
@@ -1100,10 +1104,10 @@ int main(int argc, char **argv)
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
- UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].ndi = !(trial&1);
+ UE_info->UE_sched_ctrl.harq_processes[harq_pid].ndi = !(trial&1);
- UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
+ UE_info->UE_sched_ctrl.harq_processes[harq_pid].round = round;
for (int i=0; ipdcch_cand[i] = 0;
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
index 2d1fc59755..21802cd41a 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
@@ -21,6 +21,8 @@ nfapi_mode_t nfapi_mod;
nfapi_mode_t nfapi_getmode(void) {
return nfapi_mod;
}
+void nfapi_setmode(nfapi_mode_t nfapi_mode) {}
+
int dummy_nr_ue_dl_indication(nr_downlink_indication_t *dl_info) { return(0); }
int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); }
void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 325cbb1ecc..33717c944d 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -240,7 +240,7 @@ int main(int argc, char **argv){
int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
- uint8_t frame = 1, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
+ uint8_t config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
uint32_t tx_lev = 10000, prach_errors = 0; //,tx_lev_dB;
uint64_t SSB_positions = 0x01;
@@ -536,7 +536,7 @@ int main(int argc, char **argv){
frame_parms->N_RB_UL = N_RB_UL;
frame_parms->threequarter_fs = threequarter_fs;
frame_parms->frame_type = TDD;
- frame_parms->freq_range = (mu==1 ? nr_FR1 : nr_FR2);
+ frame_parms->freq_range = (mu != 3 ? nr_FR1 : nr_FR2);
frame_parms->numerology_index = mu;
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
@@ -546,9 +546,11 @@ int main(int argc, char **argv){
frame_parms->numerology_index,
frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
- uint8_t subframe = slot/frame_parms->slots_per_subframe;
+ uint8_t frame = 1;
+ uint8_t subframe = 9;
+ uint8_t slot = 10 * frame_parms->slots_per_subframe - 1;
- if (config_index<67 && mu==1) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
+ if (config_index<67 && mu != 3) { prach_sequence_length=0; slot = subframe * frame_parms->slots_per_subframe; }
uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139;
printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
@@ -569,9 +571,11 @@ int main(int argc, char **argv){
ru->gNB_list[0] = gNB;
gNB->gNB_config.carrier_config.num_tx_ant.value = 1;
gNB->gNB_config.carrier_config.num_rx_ant.value = 1;
- if (mu==1)
+ if (mu == 0)
+ gNB->gNB_config.tdd_table.tdd_period.value = 7;
+ else if (mu == 1)
gNB->gNB_config.tdd_table.tdd_period.value = 6;
- else if (mu==3)
+ else if (mu == 3)
gNB->gNB_config.tdd_table.tdd_period.value = 3;
else {
printf("unsupported numerology %d\n",mu);
@@ -585,7 +589,7 @@ int main(int argc, char **argv){
int ret = get_nr_prach_info_from_index(config_index,
(int)frame,
- (int)slot_gNB,
+ (int)slot,
absoluteFrequencyPointA,
mu,
frame_parms->frame_type,
@@ -717,12 +721,7 @@ int main(int argc, char **argv){
bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index);
AssertFatal(bw<=122.88e6,"Illegal channel bandwidth %f (mu %d,N_RB_UL %d)\n", bw, frame_parms->numerology_index, N_RB_UL);
- if (bw <= 30.72e6)
- fs = 30.72e6;
- else if (bw <= 61.44e6)
- fs = 61.44e6;
- else if (bw <= 122.88e6)
- fs = 122.88e6;
+ fs = frame_parms->samples_per_subframe * 1e3;
LOG_I(PHY,"Running with bandwidth %f Hz, fs %f samp/s, FRAME_LENGTH_COMPLEX_SAMPLES %d\n",bw,fs,FRAME_LENGTH_COMPLEX_SAMPLES);
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index b6dc3d8f11..7cbdf9f7ba 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -47,12 +47,13 @@
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
-
+THREAD_STRUCT thread_struct;
PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE;
RAN_CONTEXT_t RC;
openair0_config_t openair0_cfg[MAX_CARDS];
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
double cpuf;
//uint8_t nfapi_mode = 0;
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index f6227e1769..8a0a2d5144 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -47,13 +47,16 @@
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
#include "common/utils/threadPool/thread-pool.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
//#define DEBUG_NR_ULSCHSIM
+THREAD_STRUCT thread_struct;
PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE;
RAN_CONTEXT_t RC;
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
@@ -137,6 +140,7 @@ int main(int argc, char **argv)
uint16_t nb_symb_sch = 12;
uint16_t nb_rb = 50;
uint8_t Imcs = 9;
+ uint8_t Nl = 1;
double DS_TDL = .03;
@@ -150,7 +154,7 @@ int main(int argc, char **argv)
randominit(0);
//while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:")) != -1) {
- while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:")) != -1) {
+ while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:W:")) != -1) {
switch (c) {
/*case 'f':
write_output_file = 1;
@@ -251,7 +255,7 @@ int main(int argc, char **argv)
case 'y':
n_tx = atoi(optarg);
- if ((n_tx == 0) || (n_tx > 2)) {
+ if ((n_tx == 0) || (n_tx > 4)) {
printf("Unsupported number of TX antennas %d. Exiting.\n", n_tx);
exit(-1);
}
@@ -261,7 +265,7 @@ int main(int argc, char **argv)
case 'z':
n_rx = atoi(optarg);
- if ((n_rx == 0) || (n_rx > 2)) {
+ if ((n_rx == 0) || (n_rx > 4)) {
printf("Unsupported number of RX antennas %d. Exiting.\n", n_rx);
exit(-1);
}
@@ -299,6 +303,10 @@ int main(int argc, char **argv)
printf("Illegal PBCH phase (0-3) got %d\n", pbch_phase);
break;*/
+ case 'W':
+ Nl = atoi(optarg);
+ break;
+
case 'm':
Imcs = atoi(optarg);
#ifdef DEBUG_NR_ULSCHSIM
@@ -335,13 +343,14 @@ int main(int argc, char **argv)
printf("-z Number of RX antennas used in UE\n");
//printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
//printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
+ printf("-W number of layer\n");
printf("-M Multiple SSB positions in burst\n");
printf("-N Nid_cell\n");
printf("-R N_RB_UL\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
- printf("-m\n");
- printf("-l\n");
- printf("-r\n");
+ printf("-m MCS\n");
+ printf("-l number of symbol\n");
+ printf("-r number of RB\n");
//printf("-O oversampling factor (1,2,4,8,16)\n");
//printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
@@ -359,8 +368,8 @@ int main(int argc, char **argv)
snr1 = snr0 + 10;
gNB2UE = new_channel_desc_scm(n_tx,
- n_rx,
- channel_model,
+ n_rx,
+ channel_model,
61.44e6, //N_RB2sampling_rate(N_RB_DL),
40e6, //N_RB2channel_bandwidth(N_RB_DL),
DS_TDL,
@@ -383,8 +392,6 @@ int main(int argc, char **argv)
initTpool(tp_param, gNB->threadPool, true);
initNotifiedFIFO(gNB->respDecode);
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
- frame_parms->nb_antennas_tx = n_tx;
- frame_parms->nb_antennas_rx = n_rx;
frame_parms->N_RB_DL = N_RB_DL;
frame_parms->N_RB_UL = N_RB_UL;
frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
@@ -392,6 +399,9 @@ int main(int argc, char **argv)
memcpy(&gNB->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
+ gNB->frame_parms.nb_antennas_tx = 1;
+ gNB->frame_parms.nb_antennas_rx = n_rx;
+
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
phy_init_nr_gNB(gNB, 0, 1); //lowmem
@@ -400,6 +410,9 @@ int main(int argc, char **argv)
UE = malloc(sizeof(PHY_VARS_NR_UE));
memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
+ UE->frame_parms.nb_antennas_tx = n_tx;
+ UE->frame_parms.nb_antennas_rx = 1;
+
//phy_init_nr_top(frame_parms);
if (init_nr_ue_signal(UE, 1) != 0) {
printf("Error at UE NR initialisation.\n");
@@ -407,7 +420,7 @@ int main(int argc, char **argv)
}
for (sf = 0; sf < 2; sf++) {
- UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8);
+ UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8, frame_parms);
if (!UE->ulsch[sf][0]) {
printf("Can't get ue ulsch structures.\n");
exit(-1);
@@ -421,8 +434,7 @@ int main(int argc, char **argv)
uint8_t length_dmrs = 1;
uint8_t N_PRB_oh;
uint16_t N_RE_prime,code_rate;
- unsigned char mod_order;
- uint8_t Nl = 1;
+ unsigned char mod_order;
uint8_t rvidx = 0;
uint8_t UE_id = 0;
@@ -432,9 +444,12 @@ int main(int argc, char **argv)
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0];
+ if ((Nl==4)||(Nl==3))
+ nb_re_dmrs = nb_re_dmrs*2;
+
mod_order = nr_get_Qm_ul(Imcs, 0);
code_rate = nr_get_code_rate_ul(Imcs, 0);
- available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
+ available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl);
TBS = nr_compute_tbs(mod_order,code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl);
printf("\nAvailable bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order);
@@ -447,7 +462,7 @@ int main(int argc, char **argv)
rel15_ul->pusch_data.rv_index = rvidx;
rel15_ul->nrOfLayers = Nl;
rel15_ul->target_code_rate = code_rate;
- rel15_ul->pusch_data.tb_size = TBS/8;
+ rel15_ul->pusch_data.tb_size = TBS>>3;
///////////////////////////////////////////////////
double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc
@@ -474,7 +489,9 @@ int main(int argc, char **argv)
harq_process_ul_ue->pusch_pdu.nr_of_symbols = nb_symb_sch;
harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*nb_codewords;
harq_process_ul_ue->pusch_pdu.pusch_data.rv_index = rvidx;
- harq_process_ul_ue->pusch_pdu.pusch_data.tb_size = TBS/8;
+ harq_process_ul_ue->pusch_pdu.pusch_data.tb_size = TBS>>3;
+ harq_process_ul_ue->pusch_pdu.target_code_rate = code_rate;
+ harq_process_ul_ue->pusch_pdu.qam_mod_order = mod_order;
unsigned char *test_input = harq_process_ul_ue->a;
///////////
@@ -610,7 +627,8 @@ int main(int argc, char **argv)
}
for (sf = 0; sf < 2; sf++)
- free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL);
+ free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL, frame_parms);
+
term_nr_ue_signal(UE, 1);
free(UE);
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index e70d08bdb3..9a3b29a637 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -91,7 +91,6 @@ double cpuf;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
THREAD_STRUCT thread_struct;
nfapi_ue_release_request_body_t release_rntis;
-uint32_t N_RB_DL = 106;
//Fixme: Uniq dirty DU instance, by global var, datamodel need better management
instance_t DUuniqInstance=0;
@@ -303,10 +302,9 @@ int main(int argc, char **argv)
int gNB_id = 0;
int ap;
int tx_offset;
- int32_t txlev=0;
+ int32_t txlev_sum = 0, atxlev[4];
int start_rb = 0;
int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)
- float target_error_rate = 0.01;
int print_perf = 0;
cpuf = get_cpu_freq_GHz();
int msg3_flag = 0;
@@ -314,7 +312,7 @@ int main(int argc, char **argv)
float roundStats[100];
double effRate[100];
double effTP[100];
- //float eff_tp_check = 0.7;
+ float eff_tp_check = 0.7;
uint8_t snrRun;
int prb_inter = 0;
@@ -322,13 +320,13 @@ int main(int argc, char **argv)
int modify_dmrs = 0;
/* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
int ptrs_arg[2] = {-1,-1};// Invalid values
- /* DMRS TYPE = dmrs_arg[0], Add Pos = dmrs_arg[1] */
- int dmrs_arg[2] = {-1,-1};// Invalid values
+ /* mapping type = dmrs_arg[0], Add Pos = dmrs_arg[1], dmrs config type = dmrs_arg[2] */
+ int dmrs_arg[3] = {-1,-1,-1};// Invalid values
uint16_t ptrsSymPos = 0;
uint16_t ptrsSymbPerSlot = 0;
uint16_t ptrsRePerSymb = 0;
- uint8_t transform_precoding = 1; // 0 - ENABLE, 1 - DISABLE
+ uint8_t transform_precoding = transformPrecoder_disabled; // 0 - ENABLE, 1 - DISABLE
uint8_t num_dmrs_cdm_grps_no_data = 1;
uint8_t mcs_table = 0;
@@ -350,7 +348,7 @@ int main(int argc, char **argv)
/* initialize the sin-cos table */
InitSinLUT();
- while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
+ while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:t:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z:W:")) != -1) {
printf("handling optarg %c\n",c);
switch (c) {
@@ -384,8 +382,8 @@ int main(int argc, char **argv)
scg_fd = fopen(optarg, "r");
if (scg_fd == NULL) {
- printf("Error opening %s\n", optarg);
- exit(-1);
+ printf("Error opening %s\n", optarg);
+ exit(-1);
}
break;
@@ -458,7 +456,11 @@ int main(int argc, char **argv)
case 'm':
Imcs = atoi(optarg);
break;
-
+
+ case 'W':
+ precod_nbr_layers = atoi(optarg);
+ break;
+
case 'n':
n_trials = atoi(optarg);
break;
@@ -484,11 +486,10 @@ int main(int argc, char **argv)
start_rb = atoi(optarg);
break;
-/*
case 't':
eff_tp_check = (float)atoi(optarg)/100;
break;
-*/
+
/*
case 'r':
ricean_factor = pow(10,-.1*atof(optarg));
@@ -505,32 +506,26 @@ int main(int argc, char **argv)
case 'y':
n_tx = atoi(optarg);
-
- if ((n_tx == 0) || (n_tx > 2)) {
- printf("Unsupported number of tx antennas %d\n", n_tx);
- exit(-1);
+ if ((n_tx == 0) || (n_tx > 4)) {
+ printf("Unsupported number of tx antennas %d\n", n_tx);
+ exit(-1);
}
-
break;
case 'z':
n_rx = atoi(optarg);
-
if ((n_rx == 0) || (n_rx > 8)) {
- printf("Unsupported number of rx antennas %d\n", n_rx);
- exit(-1);
+ printf("Unsupported number of rx antennas %d\n", n_rx);
+ exit(-1);
}
-
break;
case 'F':
input_fd = fopen(optarg, "r");
-
if (input_fd == NULL) {
- printf("Problem with filename %s\n", optarg);
- exit(-1);
+ printf("Problem with filename %s\n", optarg);
+ exit(-1);
}
-
break;
case 'G':
@@ -588,18 +583,15 @@ int main(int argc, char **argv)
break;
case 'Z':
-
- transform_precoding = 0; // enabled
+ transform_precoding = transformPrecoder_enabled;
num_dmrs_cdm_grps_no_data = 2;
mcs_table = 3;
-
- printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n", transform_precoding);
-
+ printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n", transform_precoding);
break;
default:
case 'h':
- printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]);
+ printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]);
//printf("-d Use TDD\n");
printf("-d Introduce delay in terms of number of samples\n");
printf("-f Number of frames to simulate\n");
@@ -611,17 +603,17 @@ int main(int argc, char **argv)
printf("-m MCS value\n");
printf("-n Number of trials to simulate\n");
printf("-p Use extended prefix mode\n");
- printf("-t Delay spread for multipath channel\n");
+ //printf("-t Delay spread for multipath channel\n");
printf("-u Set the numerology\n");
printf("-w Start PRB for PUSCH\n");
//printf("-x Transmission mode (1,2,6 for the moment)\n");
- printf("-y Number of TX antennas used in eNB\n");
- printf("-z Number of RX antennas used in UE\n");
+ printf("-y Number of TX antennas used at UE\n");
+ printf("-z Number of RX antennas used at gNB\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
printf("-G Offset of samples to read from file (0 default)\n");
- printf("-L \n");
+ printf("-L \n");
printf("-M Multiple SSB positions in burst\n");
printf("-N Nid_cell\n");
printf("-O oversampling factor (1,2,4,8,16)\n");
@@ -633,6 +625,7 @@ int main(int argc, char **argv)
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:3}, e.g. -U 2 0 2 \n");
printf("-Q If -F used, read parameters from file\n");
printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n");
+ printf("-W Num of layer for PUSCH\n");
exit(-1);
break;
@@ -653,16 +646,37 @@ int main(int argc, char **argv)
double sampling_frequency;
double bandwidth;
- if (N_RB_UL >= 217) sampling_frequency = 122.88;
- else if (N_RB_UL >= 106) sampling_frequency = 61.44;
- else if (N_RB_UL >= 32) sampling_frequency = 32.72;
- else { printf("Need at least 106 PRBs\b"); exit(-1); }
- if (N_RB_UL == 273) bandwidth = 100;
- else if (N_RB_UL == 217) bandwidth = 80;
- else if (N_RB_UL == 106) bandwidth = 40;
- else if (N_RB_UL == 32) bandwidth = 50;
- else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
+ if (mu == 0 && N_RB_UL == 25 ) {
+ sampling_frequency = 7.68;
+ bandwidth = 5;
+ }
+ else if (mu == 1 && N_RB_UL == 273) {
+ sampling_frequency = 122.88;
+ bandwidth = 100;
+ }
+ else if (mu == 1 && N_RB_UL == 217) {
+ sampling_frequency = 122.88;
+ bandwidth = 80;
+ }
+ else if (mu == 1 && N_RB_UL == 106) {
+ sampling_frequency = 61.44;
+ bandwidth = 40;
+ }
+ else if (mu == 1 && N_RB_UL == 24) {
+ sampling_frequency = 15.36;
+ bandwidth = 10;
+ }
+ else if (mu == 3 && N_RB_UL == 32) {
+ sampling_frequency = 61.44;
+ bandwidth = 50;
+ }
+ else {
+ printf("Add N_RB_UL %d\n",N_RB_UL);
+ exit(-1);
+ }
+
LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl);
+
if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
@@ -739,7 +753,8 @@ int main(int argc, char **argv)
// TODO do a UECAP for phy-sim
const gNB_RrcConfigurationReq conf = {
- .pdsch_AntennaPorts = { .N1 = n_tx, .N2 = 1, .XP = 1 },
+ .pdsch_AntennaPorts = { .N1 = 1, .N2 = 1, .XP = 1 },
+ .pusch_AntennaPorts = n_rx,
.minRXTXTIME = 0,
.do_CSIRS = 0,
.do_SRS = 0,
@@ -752,17 +767,18 @@ int main(int argc, char **argv)
/* RRC parameter validation for secondaryCellGroup */
fix_scd(scd);
- AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
+ AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
- gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
+ gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
- frame_parms->nb_antennas_tx = n_tx;
+ rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1,
+ secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup);
+ frame_parms->nb_antennas_tx = 1;
frame_parms->nb_antennas_rx = n_rx;
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
- cfg->carrier_config.num_tx_ant.value = n_tx;
+ cfg->carrier_config.num_tx_ant.value = 1;
cfg->carrier_config.num_rx_ant.value = n_rx;
// nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01);
phy_init_nr_gNB(gNB,0,1);
@@ -779,6 +795,8 @@ int main(int argc, char **argv)
PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*));
PHY_vars_UE_g[0][0] = UE;
memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
+ UE->frame_parms.nb_antennas_tx = n_tx;
+ UE->frame_parms.nb_antennas_rx = 1;
if (init_nr_ue_signal(UE, 1) != 0) {
printf("Error at UE NR initialisation\n");
@@ -831,7 +849,7 @@ int main(int argc, char **argv)
unsigned char *estimated_output_bit;
unsigned char *test_input_bit;
- uint32_t errors_decoding = 0;
+ uint32_t errors_decoding = 0;
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
@@ -864,23 +882,20 @@ int main(int argc, char **argv)
/* validate parameters othwerwise default values are used */
/* -U flag can be used to set DMRS parameters*/
- if(modify_dmrs)
- {
+ if(modify_dmrs) {
if(dmrs_arg[0] == 0)
- {
mapping_type = typeA;
- }
else if (dmrs_arg[0] == 1)
- {
mapping_type = typeB;
- }
/* Additional DMRS positions */
if(dmrs_arg[1] >= 0 && dmrs_arg[1] <=3 )
- {
add_pos = dmrs_arg[1];
- }
+ /* DMRS Conf Type 1 or 2 */
+ if(dmrs_arg[2] == 1)
+ dmrs_config_type = pusch_dmrs_type1;
+ else if(dmrs_arg[2] == 2)
+ dmrs_config_type = pusch_dmrs_type2;
}
- printf("NOTE: DMRS config is modified with Mapping Type %d , Additional Position %d \n", mapping_type, add_pos );
uint8_t length_dmrs = pusch_len1;
uint16_t l_prime_mask = get_l_prime(nb_symb_sch, mapping_type, add_pos, length_dmrs, start_symbol, NR_MIB__dmrs_TypeA_Position_pos2);
@@ -888,22 +903,25 @@ int main(int argc, char **argv)
printf("num dmrs sym %d\n",number_dmrs_symbols);
uint8_t nb_re_dmrs = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4;
- // if transform precoding is enabled
- if (transform_precoding == 0) {
+ if ((UE->frame_parms.nb_antennas_tx==4)&&(precod_nbr_layers==4))
+ num_dmrs_cdm_grps_no_data = 2;
+
+ if (transform_precoding == transformPrecoder_enabled) {
AssertFatal(enable_ptrs == 0, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
int8_t index = get_index_for_dmrs_lowpapr_seq((NR_NB_SC_PER_RB/2) * nb_rb);
- AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
+ AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
dmrs_config_type = pusch_dmrs_type1;
+ nb_re_dmrs = 6;
printf("[ULSIM]: TRANSFORM PRECODING ENABLED. Num RBs: %d, index for DMRS_SEQ: %d\n", nb_rb, index);
}
- nb_re_dmrs = nb_re_dmrs * num_dmrs_cdm_grps_no_data;
+ nb_re_dmrs = nb_re_dmrs * num_dmrs_cdm_grps_no_data;
- unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1);
+ unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, precod_nbr_layers);
unsigned int TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers);
@@ -928,17 +946,12 @@ int main(int argc, char **argv)
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
/* -T option enable PTRS */
- if(enable_ptrs)
- {
+ if(enable_ptrs) {
/* validate parameters othwerwise default values are used */
if(ptrs_arg[0] == 0 || ptrs_arg[0] == 1 || ptrs_arg[0] == 2 )
- {
ptrs_time_density = ptrs_arg[0];
- }
if(ptrs_arg[1] == 2 || ptrs_arg[1] == 4 )
- {
ptrs_freq_density = ptrs_arg[1];
- }
pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
printf("NOTE: PTRS Enabled with L %d, K %d \n", ptrs_time_density, ptrs_freq_density );
}
@@ -1054,7 +1067,7 @@ int main(int argc, char **argv)
uint8_t round = 0;
crc_status = 1;
- errors_decoding = 0;
+ errors_decoding = 0;
memset((void*)roundStats,0,50*sizeof(roundStats[0]));
while (roundqam_mod_order = mod_order;
pusch_pdu->transform_precoding = transform_precoding;
pusch_pdu->data_scrambling_id = *scc->physCellId;
- pusch_pdu->nrOfLayers = 1;
+ pusch_pdu->nrOfLayers = precod_nbr_layers;
pusch_pdu->ul_dmrs_symb_pos = l_prime_mask;
pusch_pdu->dmrs_config_type = dmrs_config_type;
pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId;
pusch_pdu->scid = 0;
- pusch_pdu->dmrs_ports = 1;
+ pusch_pdu->dmrs_ports = ((1<num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
pusch_pdu->resource_alloc = 1;
pusch_pdu->rb_start = start_rb;
@@ -1126,7 +1139,7 @@ int main(int argc, char **argv)
pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
// if transform precoding is enabled
- if (transform_precoding == 0) {
+ if (transform_precoding == transformPrecoder_enabled) {
pusch_pdu->dfts_ofdm.low_papr_group_number = *scc->physCellId % 30; // U as defined in 38.211 section 6.4.1.1.1.2
pusch_pdu->dfts_ofdm.low_papr_sequence_number = 0; // V as defined in 38.211 section 6.4.1.1.1.2
@@ -1173,7 +1186,9 @@ int main(int argc, char **argv)
ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
+ ul_config.ul_config_list[0].pusch_config_pdu.dmrs_ports = ((1<physCellId % 30;// U as defined in 38.211 section 6.4.1.1.1.2
ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_sequence_number = 0;// V as defined in 38.211 section 6.4.1.1.1.2
@@ -1216,43 +1231,83 @@ int main(int argc, char **argv)
LOG_D(PHY, "Sending Uplink data \n");
nr_ue_pusch_common_procedures(UE,
slot,
- &UE->frame_parms,1);
+ &UE->frame_parms,
+ UE->frame_parms.nb_antennas_tx);
+
if (n_trials==1) {
- LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
+ LOG_M("txsig0.m","txs0", &UE->common_vars.txdata[0][slot_offset],slot_length,1,1);
LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
+ if (precod_nbr_layers > 1) {
+ LOG_M("txsig1.m","txs1", &UE->common_vars.txdata[1][slot_offset],slot_length,1,1);
+ LOG_M("txsig1F.m","txs1F", UE->common_vars.txdataF[1],frame_parms->ofdm_symbol_size*14,1,1);
+ if (precod_nbr_layers==4) {
+ LOG_M("txsig2.m","txs2", &UE->common_vars.txdata[2][slot_offset],slot_length,1,1);
+ LOG_M("txsig3.m","txs3", &UE->common_vars.txdata[3][slot_offset],slot_length,1,1);
+ LOG_M("txsig2F.m","txs2F", UE->common_vars.txdataF[2],frame_parms->ofdm_symbol_size*14,1,1);
+ LOG_M("txsig3F.m","txs3F", UE->common_vars.txdataF[3],frame_parms->ofdm_symbol_size*14,1,1);
+ }
+ }
}
///////////
////////////////////////////////////////////////////
tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
-
- txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ txlev_sum = 0;
+ for (int aa=0; aaframe_parms.nb_antennas_tx; aa++) {
+ atxlev[aa] = signal_energy(&UE->common_vars.txdata[aa][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
- }
- else n_trials = 1;
- if (input_fd == NULL ) {
+ txlev_sum += atxlev[aa];
- sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
+ if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,atxlev[aa],10*log10((double)atxlev[aa]),txlev_sum);
+ }
+ }
+ else
+ n_trials = 1;
+
+ if (input_fd == NULL) {
+ // Justification of division by precod_nbr_layers:
+ // When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
+ sigma_dB = 10 * log10((double)txlev_sum/precod_nbr_layers * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
sigma = pow(10,sigma_dB/10);
- if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)
- frame_parms->ofdm_symbol_size/(12*nb_rb));
+ if(n_trials==1) printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev_sum),(double)(double)
+ frame_parms->ofdm_symbol_size/(12*nb_rb));
for (i=0; inb_antennas_tx; aa++) {
+ for (int aa=0; aaframe_parms.nb_antennas_tx; aa++) {
s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
}
}
-
- if (UE2gNB->max_Doppler == 0) {
- multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+ // The multipath_channel() function calculates a channel matrix with only 1's. So the channel rank is 1, and we
+ // cannot use multi-layer. To solve this issue, for now we use the H_awgn_mimo matrix for multi-layer.
+ if (precod_nbr_layers == 1) {
+ if (UE2gNB->max_Doppler == 0) {
+ multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+ } else {
+ multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+ }
} else {
- multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+ double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0
+ {0.2, 1.0, 0.2, 0.1}, //rx 1
+ {0.1, 0.2, 1.0, 0.2}, //rx 2
+ {0.05, 0.1, 0.2, 1.0}}; //rx 3
+ for (i=0; inb_antennas_rx; ap++) {
+ // sum up signals from different Tx antennas
+ r_re[ap][i] = 0;
+ r_im[ap][i] = 0;
+ for (int aa=0; aanb_antennas_rx; ap++) {
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
@@ -1276,7 +1331,7 @@ int main(int argc, char **argv)
pusch_pdu->ul_dmrs_symb_pos);
ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymPos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols);
ptrsRePerSymb = ((pusch_pdu->rb_size + ptrs_freq_density - 1)/ptrs_freq_density);
- printf("[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
+ LOG_D(PHY,"[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
}
////////////////////////////////////////////////////////////
@@ -1286,130 +1341,152 @@ int main(int argc, char **argv)
gNB->UL_INFO.rx_ind.number_of_pdus = 0;
gNB->UL_INFO.crc_ind.number_crcs = 0;
- phy_procedures_gNB_common_RX(gNB, frame, slot);
+ phy_procedures_gNB_common_RX(gNB, frame, slot);
- ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot);
+ ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot);
- if (n_trials==1 && round==0) {
- LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
-
- LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1);
-
- }
-
-
- if (n_trials == 1 && round==0) {
-#ifdef __AVX2__
- __attribute__((unused))
- int off = ((nb_rb&1) == 1)? 4:0;
-#else
- __attribute__((unused))
- int off = 0;
-#endif
-
- LOG_M("rxsigF0_ext.m","rxsF0_ext",
- &gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_M("chestF0.m","chF0",
- &gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
- LOG_M("chestT0.m","chT0",
- &gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
- LOG_M("chestF0_ext.m","chF0_ext",
- &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
- (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_M("rxsigF0_comp.m","rxsF0_comp",
- &gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_M("chmagF0.m","chmF0",
- &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_M("chmagbF0.m","chmbF0",
- &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- if (n_rx == 2) {
- LOG_MM("rxsigF0_comp.m","rxsF1_comp",
- &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_ext.m","rxsF1_ext",
- &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chestF0_ext.m","chF1_ext",
- &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
- (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagF0.m","chmF1",
- &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagbF0.m","chmbF1",
- &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- } else if (n_rx == 4) {
- LOG_MM("rxsigF0_comp.m","rxsF1_comp",
- &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_comp.m","rxsF2_comp",
- &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_comp.m","rxsF3_comp",
- &gNB->pusch_vars[0]->rxdataF_comp[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_ext.m","rxsF1_ext",
- &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_ext.m","rxsF2_ext",
- &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("rxsigF0_ext.m","rxsF3_ext",
- &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chestF0_ext.m","chF1_ext",
- &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
- (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chestF0_ext.m","chF2_ext",
- &gNB->pusch_vars[0]->ul_ch_estimates_ext[2][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
- (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chestF0_ext.m","chF3_ext",
- &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
- (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagF0.m","chmF1",
- &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagF0.m","chmF2",
- &gNB->pusch_vars[0]->ul_ch_mag[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagF0.m","chmF3",
- &gNB->pusch_vars[0]->ul_ch_mag[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagbF0.m","chmbF1",
- &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagbF0.m","chmbF2",
- &gNB->pusch_vars[0]->ul_ch_magb[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
- LOG_MM("chmagbF0.m","chmbF3",
- &gNB->pusch_vars[0]->ul_ch_magb[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ if (n_trials==1 && round==0) {
+ LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
+ LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0],14*frame_parms->ofdm_symbol_size,1,1);
+ if (precod_nbr_layers > 1) {
+ LOG_M("rxsig1.m","rx1",&gNB->common_vars.rxdata[1][slot_offset],slot_length,1,1);
+ LOG_M("rxsigF1.m","rxsF1",gNB->common_vars.rxdataF[1],14*frame_parms->ofdm_symbol_size,1,1);
+ if (precod_nbr_layers==4) {
+ LOG_M("rxsig2.m","rx2",&gNB->common_vars.rxdata[2][slot_offset],slot_length,1,1);
+ LOG_M("rxsig3.m","rx3",&gNB->common_vars.rxdata[3][slot_offset],slot_length,1,1);
+ LOG_M("rxsigF2.m","rxsF2",gNB->common_vars.rxdataF[2],14*frame_parms->ofdm_symbol_size,1,1);
+ LOG_M("rxsigF3.m","rxsF3",gNB->common_vars.rxdataF[3],14*frame_parms->ofdm_symbol_size,1,1);
+ }
+ }
}
- LOG_M("rxsigF0_llr.m","rxsF0_llr",
- &gNB->pusch_vars[0]->llr[0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
- }
- ////////////////////////////////////////////////////////////
- if ((gNB->ulsch[0]->last_iteration_cnt >=
- gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) {
- error_flag = 1;
- n_errors[round][snrRun]++;
- crc_status = 1;
- } else {
- crc_status = 0;
- }
- if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index);
+ if (n_trials == 1 && round==0) {
+#ifdef __AVX2__
+ __attribute__((unused))
+ int off = ((nb_rb&1) == 1)? 4:0;
+#else
+ __attribute__((unused))
+ int off = 0;
+#endif
- //----------------------------------------------------------
- //----------------- count and print errors -----------------
- //----------------------------------------------------------
+ LOG_M("rxsigF0_ext.m","rxsF0_ext",
+ &gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("chestF0.m","chF0",
+ &gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+ LOG_M("chestT0.m","chT0",
+ &gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
+ LOG_M("chestF0_ext.m","chF0_ext",
+ &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+ (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF0_comp.m","rxsF0_comp",
+ &gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("chmagF0.m","chmF0",
+ &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("chmagbF0.m","chmbF0",
+ &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF0_llrlayers0.m","rxsF0_llrlayers0",
+ &gNB->pusch_vars[0]->llr_layers[0][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+
+ if (precod_nbr_layers==2) {
+ LOG_M("rxsigF1_ext.m","rxsF1_ext",
+ &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+ LOG_M("chestF3.m","chF3",
+ &gNB->pusch_vars[0]->ul_ch_estimates[3][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+
+ LOG_M("chestF3_ext.m","chF3_ext",
+ &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+ (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+ LOG_M("rxsigF2_comp.m","rxsF2_comp",
+ &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+ LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1",
+ &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
- if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) {
- ptrs_symbols = 0;
- for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++){
- ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1;
- }
- /* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
- available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
- printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) );
}
- for (i = 0; i < available_bits; i++) {
-
- if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
- ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
- {
- /*if(errors_scrambling == 0)
- printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
- errors_scrambling[round][snrRun]++;
- }
- }
- round++;
+ if (precod_nbr_layers==4) {
+ LOG_M("rxsigF1_ext.m","rxsF1_ext",
+ &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF2_ext.m","rxsF2_ext",
+ &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF3_ext.m","rxsF3_ext",
+ &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+ LOG_M("chestF5.m","chF5",
+ &gNB->pusch_vars[0]->ul_ch_estimates[5][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+ LOG_M("chestF10.m","chF10",
+ &gNB->pusch_vars[0]->ul_ch_estimates[10][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+ LOG_M("chestF15.m","chF15",
+ &gNB->pusch_vars[0]->ul_ch_estimates[15][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+
+
+ LOG_M("chestF5_ext.m","chF5_ext",
+ &gNB->pusch_vars[0]->ul_ch_estimates_ext[5][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+ (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("chestF10_ext.m","chF10_ext",
+ &gNB->pusch_vars[0]->ul_ch_estimates_ext[10][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+ (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("chestF15_ext.m","chF15_ext",
+ &gNB->pusch_vars[0]->ul_ch_estimates_ext[15][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+ (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+
+ LOG_M("rxsigF4_comp.m","rxsF4_comp",
+ &gNB->pusch_vars[0]->rxdataF_comp[4][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF8_comp.m","rxsF8_comp",
+ &gNB->pusch_vars[0]->rxdataF_comp[8][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF12_comp.m","rxsF12_comp",
+ &gNB->pusch_vars[0]->rxdataF_comp[12][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+ LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1",
+ &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+ LOG_M("rxsigF0_llrlayers2.m","rxsF0_llrlayers2",
+ &gNB->pusch_vars[0]->llr_layers[2][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+ LOG_M("rxsigF0_llrlayers3.m","rxsF0_llrlayers3",
+ &gNB->pusch_vars[0]->llr_layers[3][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+ }
+
+ LOG_M("rxsigF0_llr.m","rxsF0_llr",
+ &gNB->pusch_vars[0]->llr[0],precod_nbr_layers*(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+ }
+ ////////////////////////////////////////////////////////////
+
+ if ((gNB->ulsch[0]->last_iteration_cnt >=
+ gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) {
+ error_flag = 1;
+ n_errors[round][snrRun]++;
+ crc_status = 1;
+ } else
+ crc_status = 0;
+ if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index);
+
+ //----------------------------------------------------------
+ //----------------- count and print errors -----------------
+ //----------------------------------------------------------
+
+ if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) {
+ ptrs_symbols = 0;
+ for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++)
+ ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1;
+
+ /* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
+ available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
+ printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) );
+ }
+
+ for (i = 0; i < available_bits; i++) {
+
+ if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
+ ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) {
+
+ /*if(errors_scrambling == 0)
+ printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
+ errors_scrambling[round][snrRun]++;
+ }
+ }
+ round++;
} // round
@@ -1506,7 +1583,7 @@ int main(int argc, char **argv)
if(n_trials==1)
break;
- if ((float)n_errors[0][snrRun]/(float)n_trials <= target_error_rate) {
+ if (effRate[snrRun] > (eff_tp_check*TBS)) {
printf("*************\n");
printf("PUSCH test OK\n");
printf("*************\n");
diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index cb1a8c9577..5e5b4c37d3 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -60,7 +60,9 @@
#define F1AP_MAX_NB_CELLS 2
#define F1AP_MAX_NO_OF_TNL_ASSOCIATIONS 32
-#define F1AP_MAX_NO_UE_ID 1024
+#define F1AP_MAX_NO_UE_ID 1024
+#define F1AP_MAX_DU2CU_RRC_LENGTH 1024
+
typedef struct f1ap_net_ip_address_s {
unsigned ipv4:1;
unsigned ipv6:1;
@@ -307,7 +309,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
uint16_t crnti;
uint8_t *rrc_container;
int rrc_container_length;
- char du2cu_rrc_container[200];
+ char du2cu_rrc_container[F1AP_MAX_DU2CU_RRC_LENGTH];
int du2cu_rrc_container_length;
} f1ap_initial_ul_rrc_message_t;
diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h
index cad7b9f172..e43d0007e7 100644
--- a/openair2/COMMON/mac_messages_types.h
+++ b/openair2/COMMON/mac_messages_types.h
@@ -58,7 +58,7 @@
// Some constants from "LAYER2/MAC/defs.h"
#define BCCH_SDU_SIZE (512)
#define BCCH_SDU_MBMS_SIZE (512)
-#define CCCH_SDU_SIZE (512)
+#define CCCH_SDU_SIZE (1024)
#define MCCH_SDU_SIZE (512)
#define PCCH_SDU_SIZE (512)
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 5b214cf95a..67b0b610cc 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -167,7 +167,7 @@ typedef struct RadioResourceConfig_s {
long ue_TransmissionMode;
long ue_multiple_max;
//SIB2 BR Options
- long *preambleTransMax_CE_r13;
+ long preambleTransMax_CE_r13;
BOOLEAN_t prach_ConfigCommon_v1310;
BOOLEAN_t *mpdcch_startSF_CSS_RA_r13;
long mpdcch_startSF_CSS_RA_r13_val;
diff --git a/openair2/ENB_APP/enb_config_eMTC.c b/openair2/ENB_APP/enb_config_eMTC.c
index cfd057bad8..2e71f17e9d 100644
--- a/openair2/ENB_APP/enb_config_eMTC.c
+++ b/openair2/ENB_APP/enb_config_eMTC.c
@@ -681,6 +681,58 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
config_fname, cell_idx,eMTCconfig->ccparams.rach_maxHARQ_Msg3Tx);
+ switch (eMTCconfig->preambleTransMax_CE_r13) {
+ case 3:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n3;
+ break;
+
+ case 4:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n4;
+ break;
+
+ case 5:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n5;
+ break;
+
+ case 6:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n6;
+ break;
+
+ case 7:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n7;
+ break;
+
+ case 8:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n8;
+ break;
+
+ case 10:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n10;
+ break;
+
+ case 20:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n20;
+ break;
+
+ case 50:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n50;
+ break;
+
+ case 100:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n100;
+ break;
+
+ case 200:
+ RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n200;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax_CE_r13 choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
+ config_fname, cell_idx,eMTCconfig->preambleTransMax_CE_r13);
+ break;
+ }
+
switch (eMTCconfig->ccparams.pcch_defaultPagingCycle) {
case 32:
RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pcch_defaultPagingCycle= LTE_PCCH_Config__defaultPagingCycle_rf32;
diff --git a/openair2/ENB_APP/enb_paramdef_emtc.h b/openair2/ENB_APP/enb_paramdef_emtc.h
index de774c4ea6..928c9d22e3 100644
--- a/openair2/ENB_APP/enb_paramdef_emtc.h
+++ b/openair2/ENB_APP/enb_paramdef_emtc.h
@@ -147,7 +147,7 @@ typedef struct ccparams_eMTC_s {
int interval_DLHoppingConfigCommonModeA_r13_val;
int interval_DLHoppingConfigCommonModeB_r13_val;
int mpdcch_pdsch_HoppingOffset_r13;
- char *preambleTransMax_CE_r13;
+ int preambleTransMax_CE_r13;
int prach_HoppingOffset_r13;
int schedulingInfoSIB1_BR_r13;
int64_t fdd_DownlinkOrTddSubframeBitmapBR_val_r13;
@@ -253,7 +253,7 @@ typedef struct ccparams_eMTC_s {
{ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13, NULL, 0, strptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13, defstrval:"interval-FDD-r13", TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13_VAL, NULL, 0, iptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13_val, defintval:0, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_MPDCCH_PDSCH_HOPPING_OFFSET_R13, NULL, 0, iptr:&eMTCconfig->mpdcch_pdsch_HoppingOffset_r13, defintval:1, TYPE_UINT, 0}, \
-{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13, NULL, 0, strptr:&eMTCconfig->preambleTransMax_CE_r13, defstrval:"n10", TYPE_STRING, 0}, \
+{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13, NULL, 0, iptr:&eMTCconfig->preambleTransMax_CE_r13, defintval:10, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL0, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level0_r13, defstrval:"n1", TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL1, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level1_r13, defstrval:"", TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL2, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level2_r13, defstrval:"", TYPE_STRING, 0}, \
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index 7b20bfb2aa..e19f077592 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -683,15 +683,15 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
"RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
rnti, ctxt.rnti);
int UE_out_of_sync = 0;
-
if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
- for (int n = 0; n < MAX_MOBILES_PER_GNB; ++n) {
- if (RC.nrmac[instance]->UE_info.active[n] == TRUE
- && rnti == RC.nrmac[instance]->UE_info.rnti[n]) {
+ UE_iterator(RC.nrmac[instance]->UE_info.list, UE) {
+ if (UE->rnti == rnti) {
UE_out_of_sync = 0;
break;
}
}
+ if (!UE)
+ LOG_E(F1AP,"Not found rnti: %x\n", rnti);
} else {
for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
if (RC.mac[instance]->UE_info.active[n] == TRUE
@@ -701,7 +701,6 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
}
}
}
-
/* We don't need the Cause */
/* Optional RRC Container: if present, send to UE */
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h
index e634f077e2..a7bc3e8545 100644
--- a/openair2/GNB_APP/MACRLC_nr_paramdef.h
+++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h
@@ -62,12 +62,15 @@
#define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES "pusch_FailureThres"
#define CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER "dl_bler_target_upper"
#define CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER "dl_bler_target_lower"
-#define CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD "dl_rd2_bler_threshold"
#define CONFIG_STRING_MACRLC_DL_MAX_MCS "dl_max_mcs"
+#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER "ul_bler_target_upper"
+#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER "ul_bler_target_lower"
+#define CONFIG_STRING_MACRLC_UL_MAX_MCS "ul_max_mcs"
#define CONFIG_STRING_MACRLC_HARQ_ROUND_MAX "harq_round_max"
#define CONFIG_STRING_MACRLC_MIN_GRANT_PRB "min_grant_prb"
#define CONFIG_STRING_MACRLC_MIN_GRANT_MCS "min_grant_mcs"
+
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* MacRLC configuration parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
@@ -97,8 +100,10 @@
{CONFIG_STRING_MACRLC_PUSCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
{CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \
{CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER, "Lower threshold of BLER to increase DL MCS", 0, dblptr:NULL, defdblval:0.05, TYPE_DOUBLE, 0}, \
-{CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD, "Threshold of RD2/RETX2 BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.01, TYPE_DOUBLE, 0}, \
{CONFIG_STRING_MACRLC_DL_MAX_MCS, "Maximum DL MCS that should be used", 0, u8ptr:NULL, defintval:28, TYPE_UINT8, 0}, \
+{CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease UL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \
+{CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER, "Lower threshold of BLER to increase UL MCS", 0, dblptr:NULL, defdblval:0.05, TYPE_DOUBLE, 0}, \
+{CONFIG_STRING_MACRLC_UL_MAX_MCS, "Maximum UL MCS that should be used", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0}, \
{CONFIG_STRING_MACRLC_HARQ_ROUND_MAX, "Maximum number of HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \
{CONFIG_STRING_MACRLC_MIN_GRANT_PRB, "Minimal Periodic ULSCH Grant PRBs", 0, u8ptr:NULL, defintval:5, TYPE_UINT8, 0}, \
{CONFIG_STRING_MACRLC_MIN_GRANT_MCS, "Minimal Periodic ULSCH Grant MCS", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0} \
@@ -127,10 +132,13 @@
#define MACRLC_PUSCHFAILURETHRES_IDX 21
#define MACRLC_DL_BLER_TARGET_UPPER_IDX 22
#define MACRLC_DL_BLER_TARGET_LOWER_IDX 23
-#define MACRLC_DL_RD2_BLER_THRESHOLD_IDX 24
-#define MACRLC_DL_MAX_MCS_IDX 25
-#define MACRLC_HARQ_ROUND_MAX_IDX 26
-#define MACRLC_MIN_GRANT_PRB_IDX 27
-#define MACRLC_MIN_GRANT_MCS_IDX 28
+#define MACRLC_DL_MAX_MCS_IDX 24
+#define MACRLC_UL_BLER_TARGET_UPPER_IDX 25
+#define MACRLC_UL_BLER_TARGET_LOWER_IDX 26
+#define MACRLC_UL_MAX_MCS_IDX 27
+#define MACRLC_HARQ_ROUND_MAX_IDX 28
+#define MACRLC_MIN_GRANT_PRB_IDX 29
+#define MACRLC_MIN_GRANT_MCS_IDX 30
+
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
#endif
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 8a7ce64d91..089569f84e 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -132,6 +132,34 @@
#define GNB_CONFIG_STRING_ULPTRSMAXPORTS_0 "ul_ptrsMaxPorts_0"
#define GNB_CONFIG_STRING_ULPTRSPOWER_0 "ul_ptrsPower_0"
+#define GNB_CONFIG_STRING_DLBWP1_ID "dl_bwp-Id_1"
+#define GNB_CONFIG_STRING_DLBWP2_ID "dl_bwp-Id_2"
+#define GNB_CONFIG_STRING_DLBWP3_ID "dl_bwp-Id_3"
+#define GNB_CONFIG_STRING_DLBWP4_ID "dl_bwp-Id_4"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1 "dl_bwp1_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2 "dl_bwp2_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3 "dl_bwp3_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4 "dl_bwp4_locationAndBandwidth"
+#define GNB_CONFIG_STRING_SCS_DLBWP1 "dl_bwp1_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP2 "dl_bwp2_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP3 "dl_bwp3_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP4 "dl_bwp4_subcarrierSpacing"
+#define GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID "firstActiveDownlinkBWP-Id"
+#define GNB_CONFIG_STRING_DEFAULTDLBWP_ID "defaultDownlinkBWP-Id"
+#define GNB_CONFIG_STRING_ULBWP1_ID "ul_bwp-Id_1"
+#define GNB_CONFIG_STRING_ULBWP2_ID "ul_bwp-Id_2"
+#define GNB_CONFIG_STRING_ULBWP3_ID "ul_bwp-Id_3"
+#define GNB_CONFIG_STRING_ULBWP4_ID "ul_bwp-Id_4"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1 "ul_bwp1_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2 "ul_bwp2_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3 "ul_bwp3_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4 "ul_bwp4_locationAndBandwidth"
+#define GNB_CONFIG_STRING_SCS_ULBWP1 "ul_bwp1_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP2 "ul_bwp2_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP3 "ul_bwp3_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP4 "ul_bwp4_subcarrierSpacing"
+#define GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID "firstActiveUplinkBWP-Id"
+
/*--------------------------------------------------------------------------------------------------------------------*/
/* pdcch_ConfigSIB1 parameters */
/*--------------------------------------------------------------------------------------------------------------------*/
@@ -240,10 +268,33 @@
{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
{GNB_CONFIG_STRING_ULPTRSREOFFSET_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
{GNB_CONFIG_STRING_ULPTRSMAXPORTS_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->maxNrofPorts,defint64val:0,TYPE_INT64,0}, \
-{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}}
-
-
-
-
+{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID,NULL,0,i64ptr:scd->firstActiveDownlinkBWP_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID,NULL,0,i64ptr:scd->uplinkConfig->firstActiveUplinkBWP_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP1_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP2_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP3_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP4_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP1_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP2_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP3_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP4_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DEFAULTDLBWP_ID,NULL,0,i64ptr:scd->defaultDownlinkBWP_Id,defint64val:0,TYPE_INT64,0}}
#endif
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 62dc72a857..6ceab3b97d 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -213,15 +213,20 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
// *scc->n_TimingAdvanceOffset=NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0;
*scc->ssb_periodicityServingCell=NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms20;
scc->dmrs_TypeA_Position=NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2;
- *scc->ssbSubcarrierSpacing=NR_SubcarrierSpacing_kHz30;
- *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032;
- *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78;
- scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000;
+ *scc->ssbSubcarrierSpacing=mu_dl;
+ if (mu_dl == 0) {
+ *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=520432;
+ *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=38;
+ scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=520000;
+ } else {
+ *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032;
+ *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78;
+ scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000;
+ }
scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0;
- scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30;
-
+ scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_dl;
scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_DL;
- scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=13036;
+ scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_DL-1);
scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing=mu_dl;//NR_SubcarrierSpacing_kHz30;
*scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=12;
*scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero=0;
@@ -235,13 +240,13 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
timedomainresourceallocation1->startSymbolAndLength=57;
ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
timedomainresourceallocation1);
- *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=78;
+ *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=mu_ul?78:38;
*scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA=-1;
scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0;
- scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30;
+ scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_ul;
scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_UL;
*scc->uplinkConfigCommon->frequencyInfoUL->p_Max=20;
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=13036;
+ scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_UL-1);
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing=mu_ul;//NR_SubcarrierSpacing_kHz30;
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex=98;
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM=NR_RACH_ConfigGeneric__msg1_FDM_one;
@@ -277,8 +282,11 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
*scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal=-90;
scc->ssb_PositionsInBurst->present=NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap;
*ssb_bitmap=0xff;
- scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=NR_SubcarrierSpacing_kHz30;
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
+ scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=mu_dl;
+ if (mu_dl == 0)
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms10;
+ else
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots=7;
scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols=6;
scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots=2;
@@ -343,8 +351,10 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
if (*scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder!=0)
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder = NULL;
- // prepare DL Allocation lists
- nr_rrc_config_dl_tda(scc);
+ // Prepare PDSCH-TimeDomainResourceAllocation list
+ nr_rrc_config_dl_tda(scc,
+ scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+ scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
frame_type_t frame_type = get_frame_type((int)*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
if (frame_type == FDD) {
@@ -371,157 +381,204 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
/* Function to allocate dedicated serving cell config strutures */
void prepare_scd(NR_ServingCellConfig_t *scd) {
// Allocate downlink structures
-
scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList));
-
- // Downlink bandwidth part
- NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
- bwp->bwp_Id = 1;
-
- // Allocate downlink dedicated bandwidth part and PDSCH structures
- bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
- bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
- bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
-
- // Allocate DL DMRS and PTRS configuration
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
- NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
- NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
- NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
- NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
- NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
- NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
- long *dl_rbs = CALLOC(2, sizeof(long));
- for (int i=0;i<2;i++) {
- ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
- }
- NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
- long *dl_mcs = CALLOC(3, sizeof(long));
- for (int i=0;i<3;i++) {
- ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
- }
- NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
- NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
- *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
- ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
-
- // Allocate uplink structures
-
scd->uplinkConfig = CALLOC(1, sizeof(*scd->uplinkConfig));
scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->uplinkConfig->uplinkBWP_ToAddModList));
+ scd->bwp_InactivityTimer = CALLOC(1, sizeof(*scd->bwp_InactivityTimer));
+ scd->uplinkConfig->firstActiveUplinkBWP_Id = CALLOC(1, sizeof(*scd->uplinkConfig->firstActiveUplinkBWP_Id));
+ scd->firstActiveDownlinkBWP_Id = CALLOC(1, sizeof(*scd->firstActiveDownlinkBWP_Id));
+ *scd->firstActiveDownlinkBWP_Id = 1;
+ *scd->uplinkConfig->firstActiveUplinkBWP_Id = 1;
+ scd->defaultDownlinkBWP_Id = CALLOC(1, sizeof(*scd->defaultDownlinkBWP_Id));
+ *scd->defaultDownlinkBWP_Id = 0;
- NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
+ for (int j = 0; j < NR_MAX_NUM_BWP; j++) {
- // Allocate UL DMRS and PTRS structures
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
- NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
- NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
- NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
- NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
- NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
- NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
- NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
- long *n_rbs = CALLOC(2, sizeof(long));
- for (int i=0;i<2;i++) {
- ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
+ // Downlink bandwidth part
+ NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+ bwp->bwp_Id = j+1;
+
+ // Allocate downlink dedicated bandwidth part and PDSCH structures
+ bwp->bwp_Common = calloc(1, sizeof(*bwp->bwp_Common));
+ bwp->bwp_Common->pdcch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+ bwp->bwp_Common->pdsch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+ bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+
+ // Allocate DL DMRS and PTRS configuration
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
+ NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
+ NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
+ long *dl_rbs = CALLOC(2, sizeof(long));
+ for (int i=0;i<2;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
+ }
+ NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
+ long *dl_mcs = CALLOC(3, sizeof(long));
+ for (int i=0;i<3;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
+ }
+ NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
+ NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
+ *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
+ ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
+
+ // Allocate uplink structures
+
+ NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
+
+ // Allocate UL DMRS and PTRS structures
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
+ NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
+ NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
+ long *n_rbs = CALLOC(2, sizeof(long));
+ for (int i=0;i<2;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
+ long *ptrs_mcs = CALLOC(3, sizeof(long));
+ for (int i = 0; i < 3; i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
+ *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
+
+ // UL bandwidth part
+ NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
+ ubwp->bwp_Id = j+1;
+ ubwp->bwp_Common = CALLOC(1, sizeof(*ubwp->bwp_Common));
+ ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
+
+ ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+
+ ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
}
- NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
- long *ptrs_mcs = CALLOC(3, sizeof(long));
- for (int i = 0; i < 3; i++) {
- ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
- }
- NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
- *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
-
- // UL bandwidth part
- NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
- ubwp->bwp_Id = 1;
- ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
-
- ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
- ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
-
- ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
}
-/* This function checks dedicated serving cell configuration and performs fixes as needed */
+/* This function checks dedicated serving cell configuration and performs fixes as needed */
void fix_scd(NR_ServingCellConfig_t *scd) {
+
+ // Remove unused BWPs
+ int b = 0;
+ while (bdownlinkBWP_ToAddModList->list.count) {
+ if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+ asn_sequence_del(&scd->downlinkBWP_ToAddModList->list,b,1);
+ } else {
+ b++;
+ }
+ }
+
+ b = 0;
+ while (buplinkConfig->uplinkBWP_ToAddModList->list.count) {
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+ asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,b,1);
+ } else {
+ b++;
+ }
+ }
+
// Check for DL PTRS parameters validity
- if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
- // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
- for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.count-1; i >= 0; i--) {
- if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
- || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
- LOG_I(NR_RRC, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
- free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
- scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
- break;
- }
- }
- }
- if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
- // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
- for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.count-1; i >= 0; i--) {
- if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
- || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
- LOG_I(RRC, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
- free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
- scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
- break;
- }
- }
- }
- if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
- if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
- LOG_I(RRC, "Freeing DL PTRS resourceElementOffset \n");
- free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset);
- scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
- }
- if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
- LOG_I(RRC, "Freeing DL PTRS epre_Ratio \n");
- free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio);
- scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
- }
- }
+ for (int bwp_i = 0 ; bwp_idownlinkBWP_ToAddModList->list.count; bwp_i++) {
- if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
- // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
- for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
- if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1)
- || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
- LOG_I(RRC, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
- free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
- scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
- break;
+ NR_DMRS_DownlinkConfig_t *dmrs_dl_config = scd->downlinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+
+ if (dmrs_dl_config->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.count - 1; i >= 0; i--) {
+ if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
+ || (*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(GNB_APP, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(dmrs_dl_config->phaseTrackingRS);
+ dmrs_dl_config->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+
+ if (dmrs_dl_config->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.count - 1; i >= 0; i--) {
+ if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
+ || (*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
+ LOG_I(GNB_APP, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(dmrs_dl_config->phaseTrackingRS);
+ dmrs_dl_config->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+
+ if (dmrs_dl_config->phaseTrackingRS) {
+ if (*dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
+ LOG_I(GNB_APP, "Freeing DL PTRS resourceElementOffset \n");
+ free(dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset);
+ dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
+ }
+ if (*dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
+ LOG_I(GNB_APP, "Freeing DL PTRS epre_Ratio \n");
+ free(dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio);
+ dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
}
}
}
- if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
- // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
- for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
- if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
- || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
- LOG_I(RRC, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
- free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
- scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
- break;
+ // Check for UL PTRS parameters validity
+ for (int bwp_i = 0 ; bwp_iuplinkConfig->uplinkBWP_ToAddModList->list.count; bwp_i++) {
+
+ NR_DMRS_UplinkConfig_t *dmrs_ul_config = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+
+ if (dmrs_ul_config->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
+ if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1)
+ || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(GNB_APP, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(dmrs_ul_config->phaseTrackingRS);
+ dmrs_ul_config->phaseTrackingRS = NULL;
+ break;
+ }
}
}
- }
- if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
- // Check for UL PTRS parameters validity
- if (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
- LOG_I(RRC, "Freeing UL PTRS resourceElementOffset \n");
- free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
- scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+
+ if (dmrs_ul_config->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
+ if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
+ || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
+ LOG_I(GNB_APP, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(dmrs_ul_config->phaseTrackingRS);
+ dmrs_ul_config->phaseTrackingRS = NULL;
+ break;
+ }
+ }
}
+
+ if (dmrs_ul_config->phaseTrackingRS) {
+ // Check for UL PTRS parameters validity
+ if (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
+ LOG_I(GNB_APP, "Freeing UL PTRS resourceElementOffset \n");
+ free(dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+ }
+ }
+
}
}
@@ -824,10 +881,14 @@ void RCconfig_nr_macrlc() {
AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
}
RC.nrmac[j]->ulsch_max_frame_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_FRAME_INACTIVITY].uptr);
- RC.nrmac[j]->dl_bler_target_upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr);
- RC.nrmac[j]->dl_bler_target_lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr);
- RC.nrmac[j]->dl_rd2_bler_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_RD2_BLER_THRESHOLD_IDX].dblptr);
- RC.nrmac[j]->dl_max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr);
+ NR_bler_options_t *dl_bler_options = &RC.nrmac[j]->dl_bler;
+ dl_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr);
+ dl_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr);
+ dl_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr);
+ NR_bler_options_t *ul_bler_options = &RC.nrmac[j]->ul_bler;
+ ul_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_UPPER_IDX].dblptr);
+ ul_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_LOWER_IDX].dblptr);
+ ul_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_MAX_MCS_IDX].u8ptr);
RC.nrmac[j]->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_HARQ_ROUND_MAX_IDX].u8ptr);
RC.nrmac[j]->min_grant_prb = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_PRB_IDX].u8ptr);
RC.nrmac[j]->min_grant_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_MCS_IDX].u8ptr);
@@ -984,8 +1045,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
prepare_scd(scd);
paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd);
paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0};
- ////////// Physical parameters
+ ////////// Physical parameters
/* get global parameters, defined outside any section in the config file */
@@ -1062,13 +1123,17 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
if (SCDsParamList.numelt > 0) {
sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, 0);
config_get( SCDsParams,sizeof(SCDsParams)/sizeof(paramdef_t),aprefix);
- LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d \n",
+ LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d, First_active_BWP_ID %d SCS %d, LocationandBW %d \n",
(int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],
(int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],
(int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],
(int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],
(int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],
- (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,
+ (int)*scd->firstActiveDownlinkBWP_Id,
+ (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,
+ (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth
+ );
}
fix_scd(scd);
@@ -1171,29 +1236,29 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
}
LOG_I(GNB_APP,"SSB SCO %d\n",*GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).ssb_SubcarrierOffset = *GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr;
- LOG_I(RRC,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr);
+ LOG_I(GNB_APP,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N1 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr;
- LOG_I(RRC,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr);
+ LOG_I(GNB_APP,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N2 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr;
- LOG_I(RRC,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr);
+ LOG_I(GNB_APP,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.XP = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr;
- LOG_I(RRC,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
+ LOG_I(GNB_APP,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr;
LOG_I(GNB_APP,"minTXRXTIME %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIME = *GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr;
- LOG_I(RRC,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr);
+ LOG_I(GNB_APP,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr;
LOG_I(GNB_APP,"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;
- LOG_I(RRC, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr);
+ LOG_I(GNB_APP, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).do_SRS = *GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off = *GNBParamList.paramarray[i][GNB_FORCE256QAMOFF_IDX].iptr;
- LOG_I(RRC, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on");
+ LOG_I(GNB_APP, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on");
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
- NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr;
+ NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr;
LOG_I(GNB_APP, "SDAP layer is %s\n", NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap ? "enabled" : "disabled");
-
+
}//
}//End for (k=0; k configuration, &NRRRC_CONFIGURATION_REQ(msg_p), sizeof(NRRRC_CONFIGURATION_REQ(msg_p)));
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
index 855b6e9822..1acf23197c 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
@@ -49,16 +49,15 @@ uint32_t nr_compute_tbs(uint16_t Qm,
uint16_t nbp_re, nb_re;
uint32_t nr_tbs=0;
uint32_t Ninfo, Np_info, C;
- uint8_t n, scale;
+ uint8_t n;
LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl);
nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
nb_re = min(156, nbp_re) * nb_rb;
- scale = (R>1024)?11:10;
// Intermediate number of information bits
- Ninfo = ((nb_re * R * Qm * Nl)>>scale)>>tb_scaling;
-
+ // R is tabulated as 10 times the actual code rate
+ Ninfo = ((nb_re * R * Qm * Nl / 10)>>10)>>tb_scaling;
if (Ninfo <=3824) {
n = max(3, floor(log2(Ninfo)) - 6);
@@ -73,7 +72,7 @@ uint32_t nr_compute_tbs(uint16_t Qm,
n = log2(Ninfo-24)-5;
Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<
+#include
#define reserved 0xffff
@@ -1685,7 +1686,7 @@ int get_nr_prach_info_from_index(uint8_t index,
}
if ( (s_map>>subframe)&0x01 ) {
*N_RA_slot = table_6_3_3_2_3_prachConfig_Index[index][6]; // Number of RACH slots within a subframe
- if (mu == 1) {
+ if (mu == 1 && index >= 67) {
if ( (*N_RA_slot <= 1) && (slot%2 == 0) )
return 0; // no prach in even slots @ 30kHz for 1 prach per subframe
}
@@ -2094,17 +2095,15 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS*dmrs_length - N_PRB_oh;
LOG_D(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh);
- uint16_t R;
uint32_t TBS=0;
- uint8_t table_idx, Qm;
/*uint8_t mcs_table = config.pdsch_config.mcs_table.value;
uint8_t ss_type = params_rel15.search_space_type;
uint8_t dci_format = params_rel15.dci_format;
get_table_idx(mcs_table, dci_format, rnti_type, ss_type);*/
- table_idx = 0;
- R = nr_get_code_rate_dl(Imcs, table_idx);
- Qm = nr_get_Qm_dl(Imcs, table_idx);
+ uint8_t table_idx = 0;
+ uint16_t R = nr_get_code_rate_dl(Imcs, table_idx);
+ uint8_t Qm = nr_get_Qm_dl(Imcs, table_idx);
TBS = nr_compute_tbs(Qm,
R,
@@ -2125,25 +2124,25 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
TBS, N_PRB_DMRS, N_sh_symb, N_PRB_oh, R, Qm, table_idx,N_RE_prime*pdsch_rel15->rbSize*pdsch_rel15->NrOfCodewords );
}
+// the following tables contain 10 times the value reported in 214 (in line with SCF specification and to avoid fractional values)
//Table 5.1.3.1-1 of 38.214
-uint16_t Table_51311[29][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616},
- {4,658},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}};
+uint16_t Table_51311[29][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},
+ {4,6580},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730}, {6,9100}, {6,9480}};
//Table 5.1.3.1-2 of 38.214
// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
-uint16_t Table_51312[28][2] = {{2,120},{2,193},{2,308},{2,449},{2,602},{4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{6,466},{6,517},{6,567},{6,616},{6,666},
- {6,719},{6,772},{6,822},{6,873},{8,1365},{8,711},{8,754},{8,797},{8,841},{8,885},{8,1833},{8,948}};
+uint16_t Table_51312[28][2] = {{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},
+ {6,7190},{6,7720},{6,8220},{6,8730},{8,6825},{8,7110},{8,7540},{8,7970},{8,8410},{8,8850},{8,9165},{8,9480}};
//Table 5.1.3.1-3 of 38.214
-uint16_t Table_51313[29][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{4,340},
- {4,378},{4,434},{4,490},{4,553},{4,616},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666}, {6,719}, {6,772}};
+uint16_t Table_51313[29][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{4,3400},
+ {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720}};
-uint16_t Table_61411[28][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616},
- {4,658},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}};
-
-uint16_t Table_61412[28][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},
- {4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{4,699},{4,772},{6,567},{6,616},{6,666}, {6,772}};
+uint16_t Table_61411[28][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},
+ {4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730},{6,9100},{6,9480}};
+uint16_t Table_61412[28][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},
+ {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{4,6990},{4,7720},{6,5670},{6,6160},{6,6660},{6,7720}};
uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx) {
@@ -2590,6 +2589,30 @@ uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP,
return -1;
}
+uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
+ NR_SRS_Config_t *srs_config,
+ dci_field_t srs_resource_indicator) {
+
+ uint8_t n_antenna_port = 1;
+ if (get_softmodem_params()->phy_test == 1) {
+ // temporary hack to allow UL-MIMO in phy-test mode without SRS
+ n_antenna_port = *pusch_Config->maxRank;
+ }
+ else {
+ if(srs_config != NULL && srs_resource_indicator.nbits > 0) {
+ for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) {
+ NR_SRS_ResourceSet_t *srs_resource_set = srs_config->srs_ResourceSetToAddModList->list.array[rs];
+ if(srs_resource_set->usage == NR_SRS_ResourceSet__usage_codebook) {
+ NR_SRS_Resource_t *srs_resource = srs_config->srs_ResourceToAddModList->list.array[srs_resource_indicator.val];
+ AssertFatal(srs_resource != NULL,"SRS resource indicated by DCI does not exist\n");
+ n_antenna_port = 1<nrofSRS_Ports;
+ }
+ }
+ }
+ }
+ return n_antenna_port;
+}
+
uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
const NR_BWP_UplinkCommon_t *initialUplinkBWP,
const NR_CellGroupConfig_t *cg,
@@ -2598,23 +2621,23 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
nr_rnti_type_t rnti_type,
uint16_t N_RB,
int bwp_id,
+ NR_ControlResourceSetId_t coreset_id,
uint16_t cset0_bwp_size) {
uint16_t size = 0;
uint16_t numRBG = 0;
long rbg_size_config;
int num_entries = 0;
- int pusch_antenna_ports = 1; // TODO hardcoded number of antenna ports for pusch
const NR_BWP_DownlinkDedicated_t *bwpd = NULL;
const NR_BWP_UplinkDedicated_t *ubwpd = NULL;
const NR_BWP_DownlinkCommon_t *bwpc = NULL;
const NR_BWP_UplinkCommon_t *ubwpc = NULL;
- const NR_PDSCH_Config_t *pdsch_Config = NULL;
- const NR_PUSCH_Config_t *pusch_Config = NULL;
- const NR_PUCCH_Config_t *pucch_Config = NULL;
- const NR_PDCCH_Config_t *pdcch_Config = NULL;
- const NR_SRS_Config_t *srs_config = NULL;
+ NR_PDSCH_Config_t *pdsch_Config = NULL;
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ NR_PUCCH_Config_t *pucch_Config = NULL;
+ NR_PDCCH_Config_t *pdcch_Config = NULL;
+ NR_SRS_Config_t *srs_config = NULL;
if(bwp_id > 0) {
AssertFatal(cg!=NULL,"Cellgroup is null and bwp_id!=0");
bwpd=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
@@ -2648,7 +2671,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
/// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20
size += 20;
size += (uint8_t)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); // Freq domain assignment -- hopping scenario to be updated
- int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, cset0_bwp_size);
+ int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size);
AssertFatal(dci_10_size >= size, "NR_UL_DCI_FORMAT_0_0 size is bigger than NR_DL_DCI_FORMAT_1_0! 3GPP TS 38.212 Section 7.3.1.0: DCI size alignment is not fully implemented");
size += dci_10_size - size; // Padding to match 1_0 size
// UL/SUL indicator assumed to be 0
@@ -2773,6 +2796,9 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
LOG_D(NR_MAC,"dci_pdu->srs_resource_indicator.nbits %d\n",dci_pdu->srs_resource_indicator.nbits);
// Precoding info and number of layers
long transformPrecoder = get_transformPrecoding(initialUplinkBWP, pusch_Config, ubwpd, (uint8_t*)&format, rnti_type, 0);
+
+ uint8_t pusch_antenna_ports = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci_pdu->srs_resource_indicator);
+
dci_pdu->precoding_information.nbits=0;
if (pusch_Config &&
pusch_Config->txConfig != NULL){
@@ -2992,10 +3018,15 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
size += dci_pdu->antenna_ports.nbits;
LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits %d\n",dci_pdu->antenna_ports.nbits);
// Tx Config Indication
- long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI;
- if (isTciEnable != NULL) {
- dci_pdu->transmission_configuration_indication.nbits = 3;
- size += dci_pdu->transmission_configuration_indication.nbits;
+ for (int i = 0; i < pdcch_Config->controlResourceSetToAddModList->list.count; i++) {
+ if (pdcch_Config->controlResourceSetToAddModList->list.array[i]->controlResourceSetId == coreset_id) {
+ long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[i]->tci_PresentInDCI;
+ if (isTciEnable != NULL) {
+ dci_pdu->transmission_configuration_indication.nbits = 3;
+ size += dci_pdu->transmission_configuration_indication.nbits;
+ }
+ break;
+ }
}
// SRS request
if (cg->spCellConfig->spCellConfigDedicated->supplementaryUplink==NULL)
@@ -3907,25 +3938,17 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
if(ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL)
ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
- uint32_t duration,periodicity,offset;
- uint16_t symbols,max_agg;
-
AssertFatal(type0_PDCCH_CSS_config!=NULL,"No type0 CSS configuration\n");
- max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6;
-
- symbols = (1-(1<num_symbols))<first_symbol_index;
- duration = type0_PDCCH_CSS_config->search_space_duration;
- periodicity = type0_PDCCH_CSS_config->search_space_frame_period;
- if (type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1)
- offset = type0_PDCCH_CSS_config->n_0;
- else
- offset = type0_PDCCH_CSS_config->n_c;
+ const uint32_t periodicity = type0_PDCCH_CSS_config->search_space_frame_period;
+ const uint32_t offset = type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1
+ ? type0_PDCCH_CSS_config->n_0 : type0_PDCCH_CSS_config->n_c;
ss0->searchSpaceId = 0;
*ss0->controlResourceSetId = 0;
ss0->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss0->monitoringSlotPeriodicityAndOffset));
set_monitoring_periodicity_offset(ss0,periodicity,offset);
+ const uint32_t duration = type0_PDCCH_CSS_config->search_space_duration;
if (duration==1)
ss0->duration = NULL;
else{
@@ -3933,6 +3956,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
*ss0->duration = duration;
}
+ const uint16_t symbols = SL_to_bitmap(type0_PDCCH_CSS_config->first_symbol_index, type0_PDCCH_CSS_config->num_symbols);
ss0->monitoringSymbolsWithinSlot->size = 2;
ss0->monitoringSymbolsWithinSlot->bits_unused = 2;
ss0->monitoringSymbolsWithinSlot->buf[1] = 0;
@@ -3942,6 +3966,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
ss0->monitoringSymbolsWithinSlot->buf[0] |= ((symbols>>i)&0x01)<<(7-i);
}
+ const uint16_t max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6;
// max values are set according to TS38.213 Section 10.1 Table 10.1-1
ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index d1becd41f9..a658c990bc 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -55,6 +55,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDLBWP,
nr_rnti_type_t rnti_type,
uint16_t N_RB,
int bwp_id,
+ NR_ControlResourceSetId_t coreset_id,
uint16_t cset0_bwp_size);
void find_aggregation_candidates(uint8_t *aggregation_level,
@@ -120,6 +121,23 @@ int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmr
uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table);
uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB);
+uint32_t nr_compute_tbs(uint16_t Qm,
+ uint16_t R,
+ uint16_t nb_rb,
+ uint16_t nb_symb_sch,
+ uint16_t nb_dmrs_prb,
+ uint16_t nb_rb_oh,
+ uint8_t tb_scaling,
+ uint8_t Nl);
+
+/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */
+uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
+uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
+
+/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */
+uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
+uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
+
uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset);
int get_bw_tbslbrm(NR_BWP_t *genericParameters,
@@ -155,6 +173,10 @@ void get_info_from_tda_tables(int default_abc,
void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
+uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
+ NR_SRS_Config_t *srs_config,
+ dci_field_t srs_resource_indicator);
+
uint16_t compute_pucch_prb_size(uint8_t format,
uint8_t nr_prbs,
uint16_t O_tot,
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index bd693e4d88..b0d41f317b 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -434,19 +434,24 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
- if (bwp_ind && dci_format){
+ int n_ubwp = 0;
+ if (scd && scd->uplinkConfig &&
+ scd->uplinkConfig->uplinkBWP_ToAddModList)
+ n_ubwp = scd->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+ if (bwp_ind && dci_format){
switch(*dci_format){
case NR_UL_DCI_FORMAT_0_1:
- mac->UL_BWP_Id = *bwp_ind;
+ mac->UL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1;
break;
case NR_DL_DCI_FORMAT_1_1:
- mac->DL_BWP_Id = *bwp_ind;
+ mac->DL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1;
break;
default:
LOG_E(MAC, "In %s: failed to configure BWP Id from DCI with format %d \n", __FUNCTION__, *dci_format);
}
-
+ // configure ss coreset after switching BWP
+ configure_ss_coreset(mac, scd, mac->DL_BWP_Id);
} else {
if (scd->firstActiveDownlinkBWP_Id)
@@ -474,82 +479,96 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
*/
void config_control_ue(NR_UE_MAC_INST_t *mac){
- uint8_t coreset_id = 1, ss_id;
- NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
- NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+ int bwp_id;
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
- if (dl_bwp_id==0) AssertFatal(mac->scc_SIB,"dl_bwp_id 0 (DL %d,UL %d) means mac->scc_SIB should exist here!\n",(int)mac->DL_BWP_Id,(int)mac->UL_BWP_Id);
- NR_BWP_DownlinkCommon_t *bwp_Common = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Common :
- &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
+ config_bwp_ue(mac, NULL, NULL);
+ NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
-
- if (dl_bwp_id > 0 ) {
- AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n");
- AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count);
+ // configure DLbwp
+ if (scd->downlinkBWP_ToAddModList) {
+ for (int i = 0; i < scd->downlinkBWP_ToAddModList->list.count; i++) {
+ bwp_id = scd->downlinkBWP_ToAddModList->list.array[i]->bwp_Id;
+ mac->DLbwp[bwp_id-1] = scd->downlinkBWP_ToAddModList->list.array[i];
+ }
}
+
+ // configure ULbwp
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList) {
+ for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) {
+ bwp_id = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Id;
+ mac->ULbwp[bwp_id-1] = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i];
+ }
+ }
+
+ configure_ss_coreset(mac, scd, dl_bwp_id);
+}
+
+
+void configure_ss_coreset(NR_UE_MAC_INST_t *mac,
+ NR_ServingCellConfig_t *scd,
+ NR_BWP_Id_t dl_bwp_id) {
+
+ NR_BWP_DownlinkCommon_t *bwp_Common = get_bwp_downlink_common(mac, dl_bwp_id);
+ AssertFatal(bwp_Common != NULL, "bwp_Common is null\n");
+
+ NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
+ AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n");
+
+ // configuring eventual common coreset
+ NR_ControlResourceSet_t *coreset = pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
+ if (coreset)
+ mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset;
+
NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Dedicated:
scd->initialDownlinkBWP;
+
AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n");
- config_bwp_ue(mac, NULL, NULL);
NR_SetupRelease_PDCCH_Config_t *pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n");
- NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
- AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n");
- AssertFatal(pdcch_ConfigCommon->choice.setup->ra_SearchSpace != NULL, "ra_SearchSpace must be available in DL BWP\n");
-
- struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
- AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n");
- AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n");
-
struct NR_PDCCH_Config__controlResourceSetToAddModList *controlResourceSetToAddModList = pdcch_Config->choice.setup->controlResourceSetToAddModList;
AssertFatal(controlResourceSetToAddModList != NULL, "controlResourceSetToAddModList is null\n");
- AssertFatal(controlResourceSetToAddModList->list.count == 1, "controlResourceSetToAddModList->list.count=%d\n", controlResourceSetToAddModList->list.count);
- AssertFatal(controlResourceSetToAddModList->list.array[0] != NULL, "coreset[0][0] is null\n");
+
+ // configuring dedicated coreset
+ // In case network reconfigures control resource set with the same ControlResourceSetId as used for commonControlResourceSet configured via PDCCH-ConfigCommon,
+ // the configuration from PDCCH-Config always takes precedence
+ for (int i=0; ilist.count; i++) {
+ coreset = controlResourceSetToAddModList->list.array[i];
+ mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset;
+ }
struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n");
AssertFatal(searchSpacesToAddModList->list.count > 0, "list of UE specifically configured Search Spaces is empty\n");
- AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
-
- struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
- if (ul_bwp_id > 0) {
- AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n");
- AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count);
- }
- // check pdcch_Config, pdcch_ConfigCommon and DL BWP
- mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL;
- mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
-
- // Check dedicated UL BWP and pass to MAC
- mac->ULbwp[0] = ul_bwp_id>0?uplinkBWP_ToAddModList->list.array[0]:NULL;
- if (mac->ULbwp[0]) AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n");
+ AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_BWP, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
// check available Search Spaces in the searchSpacesToAddModList and pass to MAC
// note: the network configures at most 10 Search Spaces per BWP per cell (including UE-specific and common Search Spaces).
- for (ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) {
+ for (int ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) {
NR_SearchSpace_t *ss = searchSpacesToAddModList->list.array[ss_id];
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
- AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
- mac->SSpace[dl_bwp_id][ss_id] = ss;
+ AssertFatal(ss->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n");
+ mac->SSpace[dl_bwp_id][ss->searchSpaceId - 1] = ss;
}
+ struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+ AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n");
+ AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n");
+
// Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
// note: commonSearchSpaceList SIZE(1..4)
for (int css_id = 0; css_id < commonSearchSpaceList->list.count; css_id++) {
NR_SearchSpace_t *css = commonSearchSpaceList->list.array[css_id];
AssertFatal(css->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
- AssertFatal(*css->controlResourceSetId == 0 || *css->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "css->controlResourceSetId %ld is unknown, mac->coreset[%ld][%d]->controlResourceSetId %ld\n",*css->controlResourceSetId,dl_bwp_id,coreset_id-1,mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId);
-
AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
- mac->SSpace[dl_bwp_id][ss_id] = css;
- ss_id++;
+ AssertFatal(css->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n");
+ mac->SSpace[dl_bwp_id][css->searchSpaceId - 1] = css;
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 99cbdf3292..335f3be907 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -74,7 +74,7 @@
// ==========
#define NB_NR_UE_MAC_INST 1
-#define MAX_NUM_BWP 2
+#define MAX_NUM_BWP_UE 4
#define NUM_SLOT_FRAME 10
/*!\brief value for indicating BSR Timer is not running */
@@ -364,10 +364,10 @@ typedef struct {
NR_RNTI_Value_t *cs_RNTI;
NR_MIB_t *mib;
- NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP];
- NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP];
- NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
- NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_SS];
+ NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP_UE];
+ NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP_UE];
+ NR_ControlResourceSet_t *coreset[MAX_NUM_BWP_UE][FAPI_NR_MAX_CORESET_PER_BWP];
+ NR_SearchSpace_t *SSpace[MAX_NUM_BWP_UE][FAPI_NR_MAX_SS];
frame_type_t frame_type;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index 7ed99b92b5..ccd8ed8305 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -260,6 +260,8 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
NR_BWP_UplinkDedicated_t **ubwpd,
NR_BWP_UplinkCommon_t **ubwpc);
+NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id);
+
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
uint8_t dci_format,
uint8_t dci_length,
@@ -452,6 +454,10 @@ void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac);
void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format);
+void configure_ss_coreset(NR_UE_MAC_INST_t *mac,
+ NR_ServingCellConfig_t *scd,
+ NR_BWP_Id_t dl_bwp_id);
+
fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot);
void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, int slot_tx, uint8_t pdu_type);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 3851ee011d..735ff1bd54 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -94,10 +94,12 @@ void init_RA(module_id_t mod_id,
}
}
if (ss_id < 0) {
- ra_ss = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
- if (ra_ss) {
- commonSearchSpaceList = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
- ss_id = *mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+ if (mac->DL_BWP_Id>0) {
+ ra_ss = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+ if (ra_ss) {
+ commonSearchSpaceList = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+ ss_id = *mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+ }
}
}
}
@@ -743,7 +745,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
} else if (get_softmodem_params()->nsa) {
- uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
+ uint8_t mac_sdus[MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*1056];
uint16_t sdu_lengths[NB_RB_MAX] = {0};
int TBS_bytes = 848;
int mac_ce_len = 0;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 0ee6f5501c..0dfbbf2be3 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -80,7 +80,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n");
- NR_BWP_Id_t bwp_id = mac->DL_BWP_Id;
+ NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
NR_ServingCellConfigCommon_t *scc = mac->scc;
NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB;
NR_BWP_DownlinkCommon_t *bwp_Common=NULL;
@@ -91,7 +91,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
initialDownlinkBWP = scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP;
}
- bwp_Common = bwp_id>0 ? mac->DLbwp[bwp_id-1]->bwp_Common : NULL;
+ bwp_Common = dl_bwp_id>0 ? mac->DLbwp[dl_bwp_id-1]->bwp_Common : NULL;
NR_SearchSpace_t *ss;
NR_ControlResourceSet_t *coreset;
@@ -102,7 +102,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
ss_id,mac->ra.ss->searchSpaceId);
}
else
- ss = mac->SSpace[bwp_id][ss_id];
+ ss = mac->SSpace[dl_bwp_id][ss_id-1];
}
else
ss = mac->search_space_zero;
@@ -110,7 +110,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
uint8_t coreset_id = *ss->controlResourceSetId;
if(coreset_id>0) {
- coreset = mac->coreset[bwp_id][coreset_id - 1];
+ coreset = mac->coreset[dl_bwp_id][coreset_id - 1];
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
} else {
coreset = mac->coreset0;
@@ -169,7 +169,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->SubcarrierSpacing = bwp_Common->genericParameters.subcarrierSpacing;
}
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_RA:
@@ -185,7 +185,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
}
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
- rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+ rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
break;
case NR_RNTI_P:
break;
@@ -200,7 +200,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_SP_CSI:
@@ -223,7 +223,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, mac->type0_PDCCH_CSS_config.num_rbs);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_SFI:
@@ -273,11 +273,17 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
LOG_D(NR_MAC, "[DCI_CONFIG] ra_rnti %p (%x) crnti %p (%x) t_crnti %p (%x)\n", &ra->ra_rnti, ra->ra_rnti, &mac->crnti, mac->crnti, &ra->t_crnti, ra->t_crnti);
- // loop over all available SS for CORESET ID 1
+ // loop over all available SS for bwp_id
if (bwpd) {
- for (ss_id = 0; ss_id < FAPI_NR_MAX_SS && mac->SSpace[bwp_id][ss_id] != NULL; ss_id++){
+ for (ss_id = 1; ss_id <= FAPI_NR_MAX_SS; ss_id++){
+
+ if(mac->SSpace[bwp_id][ss_id-1]==NULL) {
+ continue;
+ }
+
LOG_D(NR_MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
- NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id];
+ NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id-1];
+ AssertFatal(ss_id == ss->searchSpaceId,"SS IDs don't correspond\n");
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
@@ -285,15 +291,6 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
case NR_SearchSpace__searchSpaceType_PR_common:
// this is for CSSs, we use BWP common and pdcch_ConfigCommon
- // Fetch configuration for searchSpaceZero
- // note: The search space with the SearchSpaceId = 0 identifies the search space configured via PBCH (MIB) and in ServingCellConfigCommon (searchSpaceZero).
- if (pdcch_ConfigCommon->choice.setup->searchSpaceZero){
- if (pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 == NULL){
- pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
- }
- *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = 0;
- LOG_D(NR_MAC, "[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP\n");
- }
if (ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0){
// check available SS IDs
if (pdcch_ConfigCommon->choice.setup->ra_SearchSpace){
@@ -424,34 +421,18 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
AssertFatal(1==0,"Handle DCI searching when CellGroup without dedicated BWP\n");
}
// Search space 0, CORESET ID 0
-
- NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
-
- if (pdcch_ConfigCommon &&
- pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 &&
- !get_softmodem_params()->nsa) {
-
- NR_SearchSpace_t *ss0 = mac->search_space_zero;
- fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
-
- if (ss0->searchSpaceId == *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
- if( (frame%2 == mac->type0_PDCCH_CSS_config.sfn_c) && (slot == mac->type0_PDCCH_CSS_config.n_0) ){
- rel15->num_dci_options = 1;
- rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
- config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
- fill_dci_search_candidates(ss0, rel15);
- }
- }
- }
- else if (!get_softmodem_params()->nsa) { // use coreset0/ss0
+ if (!get_softmodem_params()->nsa) {
NR_SearchSpace_t *ss0 = mac->search_space_zero;
if(ss0) {
- fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15;
+ fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
rel15->num_dci_options = 1;
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
- config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
+ config_dci_pdu(mac,
+ rel15,
+ dl_config,
+ ((frame%2==mac->type0_PDCCH_CSS_config.sfn_c)&&(slot==mac->type0_PDCCH_CSS_config.n_0)) ? NR_RNTI_SI : NR_RNTI_C,
+ -1);
fill_dci_search_candidates(ss0, rel15);
- dl_config->number_pdus = 1;
}
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 22cb2012e5..1137a1da77 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -191,32 +191,27 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
NR_BWP_UplinkDedicated_t **ubwpd,
NR_BWP_UplinkCommon_t **ubwpc) {
- if (dl_bwp_id > 0) {
- AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n",
- (int)dl_bwp_id-1);
- *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
- if (mac->DLbwp[dl_bwp_id-1]->bwp_Common) *bwpc = mac->DLbwp[dl_bwp_id-1]->bwp_Common;
- else if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
- else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
- AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
- } else {
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
- *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
- if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
- else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
- AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
- }
+ if (dl_bwp_id > 0) {
+ AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n", (int)dl_bwp_id-1);
+ *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
+ } else {
+ if (mac->cg &&
+ mac->cg->spCellConfig &&
+ mac->cg->spCellConfig->spCellConfigDedicated &&
+ mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
+ *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+ }
+
+ *bwpc = get_bwp_downlink_common(mac, dl_bwp_id);
+ AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
if (ul_bwp_id > 0) {
AssertFatal(mac->ULbwp[ul_bwp_id-1]!=NULL,"mac->ULbwp[%d] is null, shouldn't be\n",
ul_bwp_id-1);
*ubwpd = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated;
if (mac->ULbwp[ul_bwp_id-1]->bwp_Common) *ubwpc = mac->ULbwp[ul_bwp_id-1]->bwp_Common;
- else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+ else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
}
@@ -227,12 +222,24 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
*ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+ if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+ else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
}
}
+NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id) {
+ NR_BWP_DownlinkCommon_t *bwp_Common = NULL;
+ if (dl_bwp_id > 0 && mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
+ bwp_Common = mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[dl_bwp_id-1]->bwp_Common;
+ } else if (mac->scc) {
+ bwp_Common = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
+ } else if (mac->scc_SIB) {
+ bwp_Common = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
+ }
+ return bwp_Common;
+}
+
NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon) {
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList=NULL;
@@ -633,10 +640,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
RA_config_t *ra = &mac->ra;
fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
uint8_t is_Msg3 = 0;
+ NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
int default_abc = 1;
uint16_t n_RB_DLBWP;
- if (mac->DLbwp[0]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ else if (mac->scc) n_RB_DLBWP = NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
else if (mac->scc_SIB) n_RB_DLBWP = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
else n_RB_DLBWP = mac->type0_PDCCH_CSS_config.num_rbs;
@@ -806,7 +816,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
- NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+ NR_PDSCH_Config_t *pdsch_config= (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) ? mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
int is_common=0;
if(rnti == SI_RNTI) {
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
@@ -833,14 +843,19 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
}
if (!get_softmodem_params()->sa) { // NSA mode is not using the Initial BWP
- dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup;
+ dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
}
- } else if (mac->DLbwp[0]) {
- dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing;
- pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup;
+ } else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) {
+ dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing;
+ pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
+ } else if (mac->scc) {
+ dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ dlsch_config_pdu_1_0->SubcarrierSpacing = mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+ pdsch_config = NULL;
} else if (mac->scc_SIB) {
dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -858,13 +873,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
- if (mac->DLbwp[0] &&
- mac->DLbwp[0]->bwp_Dedicated &&
- mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
- mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
- else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ if (dl_bwp_id>0 &&
+ mac->DLbwp[dl_bwp_id-1] &&
+ mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated &&
+ mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config &&
+ mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
+ pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
+ else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] && mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
+ pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
@@ -881,10 +897,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
mappingtype = pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
struct NR_DMRS_DownlinkConfig *dl_dmrs_config = NULL;
- if(mac->DLbwp[0])
+ if(dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] != NULL)
dl_dmrs_config = (mappingtype == typeA) ?
- mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
- mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
+ mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
+ mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
dlsch_config_pdu_1_0->nscid = 0;
if(dl_dmrs_config && dl_dmrs_config->scramblingID0)
@@ -897,7 +913,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
(get_softmodem_params()->nsa) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position,
dlsch_config_pdu_1_0->number_symbols,
dlsch_config_pdu_1_0->start_symbol,
- mappingtype, 1);
+ mappingtype,
+ 1);
dlsch_config_pdu_1_0->dmrsConfigType = (dl_dmrs_config != NULL) ?
(dl_dmrs_config->dmrs_Type == NULL ? 0 : 1) : 0;
@@ -919,6 +936,23 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
return -1;
}
+ dlsch_config_pdu_1_0->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table);
+ int R = nr_get_code_rate_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table);
+ dlsch_config_pdu_1_0->targetCodeRate = R;
+ if (dlsch_config_pdu_1_0->targetCodeRate == 0 || dlsch_config_pdu_1_0->qamModOrder == 0) {
+ LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
+ return -1;
+ }
+
+ int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
+ int nb_re_dmrs = ((dlsch_config_pdu_1_0->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? 6:4)*dlsch_config_pdu_1_0->n_dmrs_cdm_groups;
+ dlsch_config_pdu_1_0->TBS = nr_compute_tbs(dlsch_config_pdu_1_0->qamModOrder,
+ R,
+ dlsch_config_pdu_1_0->number_rbs,
+ dlsch_config_pdu_1_0->number_symbols,
+ nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_0->dlDmrsSymbPos),
+ nb_rb_oh, 0, 1);
+
int bw_tbslbrm;
if (mac->scc || mac->scc_SIB || mac->cg) {
NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters :
@@ -951,14 +985,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
// Sanity check for pucch_resource_indicator value received to check for false DCI.
valid = 0;
- if (mac->ULbwp[0] &&
- mac->ULbwp[0]->bwp_Dedicated &&
- mac->ULbwp[0]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup&&
- mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
- pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+ if (mac->ULbwp[ul_bwp_id-1] &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
+ pucch_res_set_cnt = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
for (int id = 0; id < pucch_res_set_cnt; id++) {
- if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+ if (dci->pucch_resource_indicator < mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
valid = 1;
break;
}
@@ -1061,8 +1095,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
* 47 DMRS_SEQ_INI:
*/
- if (dci->bwp_indicator.val > 1) {
- LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > 1 Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
+ if (dci->bwp_indicator.val > NR_MAX_NUM_BWP) {
+ LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > NR_MAX_NUM_BWP Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
return -1;
}
config_bwp_ue(mac, &dci->bwp_indicator.val, &dci_format);
@@ -1289,8 +1323,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
/* dmrs symbol positions*/
dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_Config,
- mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
- dlsch_config_pdu_1_1->number_symbols,
+ mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
+ dlsch_config_pdu_1_1->number_symbols,
dlsch_config_pdu_1_1->start_symbol,
mappingtype,
dlsch_config_pdu_1_1->n_front_load_symb);
@@ -1336,6 +1370,25 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dl_config->number_pdus = dl_config->number_pdus + 1;
/* TODO same calculation for MCS table as done in UL */
dlsch_config_pdu_1_1->mcs_table = (pdsch_Config->mcs_Table) ? (*pdsch_Config->mcs_Table + 1) : 0;
+ dlsch_config_pdu_1_1->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table);
+ int R = nr_get_code_rate_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table);
+ dlsch_config_pdu_1_1->targetCodeRate = R;
+ if (dlsch_config_pdu_1_1->targetCodeRate == 0 || dlsch_config_pdu_1_1->qamModOrder == 0) {
+ LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
+ return -1;
+ }
+ uint8_t Nl = 0;
+ for (int i = 0; i < 12; i++) { // max 12 ports
+ if ((dlsch_config_pdu_1_1->dmrs_ports>>i)&0x01) Nl += 1;
+ }
+ int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
+ int nb_re_dmrs = ((dmrs_type == NULL) ? 6:4)*dlsch_config_pdu_1_1->n_dmrs_cdm_groups;
+ dlsch_config_pdu_1_1->TBS = nr_compute_tbs(dlsch_config_pdu_1_1->qamModOrder,
+ R,
+ dlsch_config_pdu_1_1->number_rbs,
+ dlsch_config_pdu_1_1->number_symbols,
+ nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_1->dlDmrsSymbPos),
+ nb_rb_oh, 0, Nl);
// TBS_LBRM according to section 5.4.2.1 of 38.212
long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers;
@@ -1459,7 +1512,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
NR_BWP_UplinkCommon_t *initialUplinkBWP;
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+ NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
if (mac->cg && ubwp &&
mac->cg->spCellConfig &&
mac->cg->spCellConfig->spCellConfigDedicated &&
@@ -2287,7 +2340,7 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
NR_PUCCH_Config_t *pucch_Config = NULL;
int scs;
- NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+ NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
NR_BWP_UplinkCommon_t *initialUplinkBWP;
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
@@ -2432,7 +2485,7 @@ uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
csi_period_offset(csirep, NULL, &period, &offset);
int scs;
- NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+ NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
NR_BWP_UplinkCommon_t *initialUplinkBWP;
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
@@ -2513,7 +2566,8 @@ uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI:
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI:
- AssertFatal(1==0,"Measurement report based on CSI-RS not availalble\n");
+ LOG_E(NR_MAC,"Measurement report based on CSI-RS not available\n");
+ break;
default:
AssertFatal(1==0,"Invalid CSI report quantity type %d\n",csi_reportconfig->reportQuantity.present);
}
@@ -2659,14 +2713,14 @@ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u
int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
int N_RB = 0, start_RB;
+ NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
switch(rnti_type) {
case NR_RNTI_RA:
case NR_RNTI_TC:
case NR_RNTI_P: {
- NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
if (mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero) {
uint8_t coreset_id = 0; // assuming controlResourceSetId is 0 for controlResourceSetZero
- NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id-1][coreset_id];
+ NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id][coreset_id];
get_coreset_rballoc(coreset->frequencyDomainResources.buf,&N_RB,&start_RB);
} else {
N_RB = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -2677,7 +2731,7 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
N_RB = mac->type0_PDCCH_CSS_config.num_rbs;
break;
case NR_RNTI_C:
- N_RB = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ N_RB = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
break;
}
return N_RB;
@@ -2696,14 +2750,16 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
int fsize = 0;
int rnti_type = get_rnti_type(mac, rnti);
+ NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id ;
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id ;
int N_RB_UL = 0;
- if(mac->scc_SIB) {
- N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- } else if(mac->ULbwp[0]) {
- N_RB_UL = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if(ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) {
+ N_RB_UL = NRRIV2BW(mac->ULbwp[ul_bwp_id - 1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
} else if(mac->scc) {
N_RB_UL = NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ } else if(mac->scc_SIB) {
+ N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
}
LOG_D(MAC,"nr_extract_dci_info : dci_pdu %lx, size %d\n",*dci_pdu,dci_size);
@@ -2767,7 +2823,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
#endif
// check BWP id
- if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
else N_RB=NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
// Freq domain assignment (275rb >> fsize = 16)
@@ -2950,7 +3006,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
case NR_RNTI_TC:
// check BWP id
- if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
else N_RB=mac->type0_PDCCH_CSS_config.num_rbs;
@@ -3032,7 +3088,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
break;
case NR_UL_DCI_FORMAT_0_0:
- if (mac->ULbwp[0]) N_RB_UL=NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if (mac->ULbwp[ul_bwp_id-1]) N_RB_UL=NRRIV2BW(mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
else N_RB_UL=NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
switch(rnti_type)
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 0afad893d7..49aebb7daa 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -44,6 +44,7 @@
/* MAC */
#include "NR_MAC_COMMON/nr_mac.h"
+#include "NR_MAC_COMMON/nr_mac_common.h"
#include "NR_MAC_UE/mac_proto.h"
#include "NR_MAC_UE/mac_extern.h"
@@ -114,18 +115,20 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
*/
long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
long k2 = -1;
+
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
// Get K2 from RRC configuration
- NR_PUSCH_Config_t *pusch_config=mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
+ NR_PUSCH_Config_t *pusch_config=mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) {
pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup;
}
- else if (mac->ULbwp[0] &&
- mac->ULbwp[0]->bwp_Common&&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon&&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
- mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ else if (mac->ULbwp[ul_bwp_id-1] &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common&&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+ pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
}
else if (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList)
pusch_TimeDomainAllocationList=mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
@@ -154,6 +157,7 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
*/
fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot)
{
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
NR_TDD_UL_DL_ConfigCommon_t *tdd_config = mac->scc==NULL ? mac->scc_SIB->tdd_UL_DL_ConfigurationCommon : mac->scc->tdd_UL_DL_ConfigurationCommon;
//Check if request to access ul_config is for a UL slot
@@ -165,8 +169,8 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
// Calculate the index of the UL slot in mac->ul_config_request list. This is
// based on the TDD pattern (slot configuration period) and number of UL+mixed
// slots in the period. TS 38.213 Sec 11.1
- int mu = mac->ULbwp[0] ?
- mac->ULbwp[0]->bwp_Common->genericParameters.subcarrierSpacing :
+ int mu = mac->ULbwp[ul_bwp_id-1] ?
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
const int n = nr_slots_per_frame[mu];
const int num_slots_per_tdd = tdd_config ? (n >> (7 - tdd_config->pattern1.dl_UL_TransmissionPeriodicity)) : n;
@@ -188,17 +192,21 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
NR_ServingCellConfigCommon_t *scc = mac->scc;
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
+ NR_SRS_Config_t *srs_config = NULL;
if (mac->cg &&
mac->cg->spCellConfig &&
mac->cg->spCellConfig->spCellConfigDedicated &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
+ mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
+ srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
+ }
- NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ?
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup :
+ NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[ul_bwp_id-1] ?
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup :
(ubwpd?
ubwpd->pusch_Config->choice.setup:
NULL);
@@ -212,7 +220,7 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
else
transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
}
-
+ pusch_config_pdu->transform_precoding = transformPrecoder;
/* PRECOD_NBR_LAYERS */
if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_nonCodebook));
@@ -220,11 +228,14 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook)){
- uint8_t n_antenna_port = 0; //FIXME!!!
+ // The UE shall transmit PUSCH using the same antenna port(s) as the SRS port(s) in the SRS resource indicated by the DCI format 0_1
+ // 38.214 Section 6.1.1
+
+ uint8_t n_antenna_port = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci->srs_resource_indicator);
if (n_antenna_port == 1); // 1 antenna port and the higher layer parameter txConfig = codebook 0 bits
- if (n_antenna_port == 4){ // 4 antenna port and the higher layer parameter txConfig = codebook
+ if (n_antenna_port == 4) { // 4 antenna port and the higher layer parameter txConfig = codebook
// Table 7.3.1.1.2-2: transformPrecoder=disabled and maxRank = 2 or 3 or 4
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled)
@@ -234,54 +245,54 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][0];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][2];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][4];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5];
}
}
// Table 7.3.1.1.2-3: transformPrecoder= enabled, or transformPrecoder=disabled and maxRank = 1
if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled)
|| (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled))
- && (*pusch_Config->maxRank == 1)){
+ && (*pusch_Config->maxRank == 1)) {
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][6];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][8];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][10];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11];
}
}
}
- if (n_antenna_port == 4){ // 2 antenna port and the higher layer parameter txConfig = codebook
+ if (n_antenna_port == 2) {
+ // 2 antenna port and the higher layer parameter txConfig = codebook
// Table 7.3.1.1.2-4: transformPrecoder=disabled and maxRank = 2
- if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)){
-
+ if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)) {
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][12];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][14];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15];
}
}
@@ -289,16 +300,16 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
// Table 7.3.1.1.2-5: transformPrecoder= enabled, or transformPrecoder= disabled and maxRank = 1
if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled)
|| (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled))
- && (*pusch_Config->maxRank == 1)){
+ && (*pusch_Config->maxRank == 1)) {
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][16];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17];
}
if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][18];
- pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19];
+ pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19];
}
}
@@ -307,9 +318,9 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
/*-------------------- Changed to enable Transform precoding in RF SIM------------------------------------------------*/
- /*if (pusch_config_pdu->transform_precoding == transform_precoder_enabled) {
+ /*if (pusch_config_pdu->transformPrecoder == transformPrecoder_enabled) {
- pusch_config_dedicated->transform_precoder = transform_precoder_enabled;
+ pusch_config_dedicated->transform_precoder = transformPrecoder_enabled;
if(pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL) {
@@ -331,15 +342,15 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
}
} else
- pusch_config_dedicated->transform_precoder = transform_precoder_disabled;*/
+ pusch_config_dedicated->transformPrecoder = ttransformPrecoder_disabled;*/
}
// todo: this function shall be reviewed completely because of the many comments left by the author
-void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
+void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
- /* ANTENNA_PORTS */
- uint8_t rank = 1; // We need to initialize rank FIXME!!!
+ uint8_t rank = pusch_config_pdu->nrOfLayers;
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
NR_ServingCellConfigCommon_t *scc = mac->scc;
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
@@ -350,7 +361,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
+ NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
long transformPrecoder;
@@ -375,51 +386,44 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->dmrs_Type;
}
- LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val);
+ LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val);
+
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
- (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
- pusch_config_pdu->dmrs_ports = dci->antenna_ports.val; //TBC
+ (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+ pusch_config_pdu->dmrs_ports = 1<antenna_ports.val;
}
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
- (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7
+ (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
- pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val); //TBC
- //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports > 3)?2:1; //FIXME
+ pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val));
+ *n_front_load_symb = (dci->antenna_ports.val > 3)?2:1;
}
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) &&
(dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-8/9/10/11
if (rank == 1) {
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC
- pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val); //TBC
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1;
+ pusch_config_pdu->dmrs_ports =1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val));
}
if (rank == 2){
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1; //TBC
- pusch_config_pdu->dmrs_ports = 0; //FIXME
- //pusch_config_pdu->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?0:2):0;
- //pusch_config_pdu->dmrs_ports[1] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?2:3):1;
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1;
+ pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?((dci->antenna_ports.val> 2)?0x5:0xc):0x3;
}
if (rank == 3){
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
- pusch_config_pdu->dmrs_ports = 0; //FIXME
- //pusch_config_pdu->dmrs_ports[0] = 0;
- //pusch_config_pdu->dmrs_ports[1] = 1;
- //pusch_config_pdu->dmrs_ports[2] = 2;
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+ pusch_config_pdu->dmrs_ports = 0x7; // ports 0-2
}
if (rank == 4){
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
- pusch_config_pdu->dmrs_ports = 0; //FIXME
- //pusch_config_pdu->dmrs_ports[0] = 0;
- //pusch_config_pdu->dmrs_ports[1] = 1;
- //pusch_config_pdu->dmrs_ports[2] = 2;
- //pusch_config_pdu->dmrs_ports[3] = 3;
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+ pusch_config_pdu->dmrs_ports = 0xf; // ports 0-3
}
}
@@ -428,8 +432,8 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
if (rank == 1){
pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC
- pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val; //TBC
- //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 6)?2:1; //FIXME
+ pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val);
+ *n_front_load_symb = (dci->antenna_ports.val > 6)?2:1;
}
if (rank == 2){
@@ -437,7 +441,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
pusch_config_pdu->dmrs_ports = 0; //FIXME
//pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_13[dci->antenna_ports.val][1];
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_13[dci->antenna_ports.val][2];
- //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME
+ //n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME
}
if (rank == 3){
@@ -446,7 +450,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
//pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_14[dci->antenna_ports.val][1];
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_14[dci->antenna_ports.val][2];
//pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_14[dci->antenna_ports.val][3];
- //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
+ //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
}
if (rank == 4){
@@ -456,7 +460,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_15[dci->antenna_ports.val][2];
//pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_15[dci->antenna_ports.val][3];
//pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_15[dci->antenna_ports.val][4];
- //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
+ //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
}
}
@@ -500,7 +504,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
if (rank == 1){
pusch_config_pdu->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_20[dci->antenna_ports.val][0]; //TBC
pusch_config_pdu->dmrs_ports = table_7_3_1_1_2_20[dci->antenna_ports.val][1]; //TBC
- //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME
+ //n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME
}
if (rank == 2){
@@ -508,7 +512,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
pusch_config_pdu->dmrs_ports = 0; //FIXME
//pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_21[dci->antenna_ports.val][1];
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_21[dci->antenna_ports.val][2];
- //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME
+ //n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME
}
if (rank == 3){
@@ -517,7 +521,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
//pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_22[dci->antenna_ports.val][1];
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_22[dci->antenna_ports.val][2];
//pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_22[dci->antenna_ports.val][3];
- //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME
+ //n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME
}
if (rank == 4){
@@ -527,7 +531,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
//pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_23[dci->antenna_ports.val][2];
//pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_23[dci->antenna_ports.val][3];
//pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_23[dci->antenna_ports.val][4];
- //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
+ //n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
}
}
LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, dmrs_ports %d\n",pusch_config_pdu->num_dmrs_cdm_grps_no_data,pusch_config_pdu->dmrs_ports);
@@ -559,23 +563,25 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
int N_PRB_oh = 0;
int rnti_type = get_rnti_type(mac, rnti);
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
// Common configuration
pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1;
pusch_config_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
pusch_config_pdu->nrOfLayers = 1;
+ pusch_config_pdu->Tpmi = 0;
pusch_config_pdu->rnti = rnti;
NR_BWP_UplinkCommon_t *initialUplinkBWP;
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
pusch_dmrs_AdditionalPosition_t add_pos = pusch_dmrs_pos2;
- pusch_maxLength_t dmrslength = pusch_len1;
+ int dmrslength = 1;
if (rar_grant) {
// Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0
- NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+ NR_BWP_Uplink_t *ubwp = mac->ULbwp[ul_bwp_id-1];
NR_BWP_UplinkDedicated_t *ibwp;
int scs,abwp_start,abwp_size,startSymbolAndLength,mappingtype;
NR_PUSCH_Config_t *pusch_Config=NULL;
@@ -686,8 +692,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
int target_ss;
bool valid_ptrs_setup = 0;
- uint16_t n_RB_ULBWP;
- n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
+ uint16_t n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
pusch_config_pdu->bwp_size = n_RB_ULBWP;
@@ -713,11 +719,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
} else if (*dci_format == NR_UL_DCI_FORMAT_0_1) {
config_bwp_ue(mac, &dci->bwp_indicator.val, dci_format);
+
get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
ul_layers_config(mac, pusch_config_pdu, dci);
- ul_ports_config(mac, pusch_config_pdu, dci);
+ ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci);
} else {
@@ -725,6 +732,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
return -1;
}
+
NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon = ubwpc->pusch_ConfigCommon->choice.setup;
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = choose_ul_tda_list(pusch_Config,pusch_ConfigCommon);
@@ -748,7 +756,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
uint32_t n_RS_Id = 0;
- if (NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL)
+ if (NR_DMRS_ulconfig->transformPrecodingEnabled &&
+ NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL)
n_RS_Id = *NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity;
else
n_RS_Id = *mac->scc->physCellId;
@@ -823,20 +832,21 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->absolute_delta_PUSCH = 4;
}
- if (NR_DMRS_ulconfig != NULL) {
+ if (NR_DMRS_ulconfig != NULL)
add_pos = (NR_DMRS_ulconfig->dmrs_AdditionalPosition == NULL) ? 2 : *NR_DMRS_ulconfig->dmrs_AdditionalPosition;
- dmrslength = NR_DMRS_ulconfig->maxLength == NULL ? pusch_len1 : pusch_len2;
- }
/* DMRS */
l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols,
mappingtype, add_pos, dmrslength,
pusch_config_pdu->start_symbol_index,
mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
- if ((mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled))
- pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
- else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled))
+ if ((mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled)) {
+ if (*dci_format != NR_UL_DCI_FORMAT_0_1) {
+ pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
+ }
+ } else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) {
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+ }
// Num PRB Overhead from PUSCH-ServingCellConfig
if (mac->cg &&
@@ -850,16 +860,16 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
else N_PRB_oh = 0;
/* PTRS */
- if (mac->ULbwp[0] &&
- mac->ULbwp[0]->bwp_Dedicated &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
- mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ if (mac->ULbwp[ul_bwp_id-1] &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
+ mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
- valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
+ valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table,
&pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density,
&pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
@@ -882,7 +892,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
rnti_types[rnti_type]);
pusch_config_pdu->ul_dmrs_symb_pos = l_prime_mask;
- pusch_config_pdu->target_code_rate = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
+ uint16_t R = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
+ pusch_config_pdu->target_code_rate = R;
pusch_config_pdu->qam_mod_order = nr_get_Qm_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
if (pusch_config_pdu->target_code_rate == 0 || pusch_config_pdu->qam_mod_order == 0) {
@@ -901,14 +912,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
// Compute TBS
pusch_config_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_config_pdu->qam_mod_order,
- pusch_config_pdu->target_code_rate,
+ R,
pusch_config_pdu->rb_size,
pusch_config_pdu->nr_of_symbols,
nb_dmrs_re_per_rb*number_dmrs_symbols,
N_PRB_oh,
0, // TBR to verify tb scaling
- pusch_config_pdu->nrOfLayers)/8;
-
+ pusch_config_pdu->nrOfLayers)>>3;
return 0;
}
@@ -955,9 +965,10 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
continue;
}
- NR_BWP_t ubwp = mac->ULbwp[0] ?
- mac->ULbwp[0]->bwp_Common->genericParameters :
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+ NR_BWP_t ubwp = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+ mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters :
+ mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
@@ -1062,9 +1073,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
if(mac->cg != NULL){ // we have a cg
- nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
- nr_schedule_csi_for_im(mac, rx_frame, rx_slot);
-
dcireq.module_id = mod_id;
dcireq.gNB_index = gNB_index;
dcireq.cc_id = cc_id;
@@ -1074,9 +1082,14 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
mac->dl_config_request = dcireq.dl_config_req;
+ nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
+ nr_schedule_csi_for_im(mac, rx_frame, rx_slot);
+ dcireq.dl_config_req = mac->dl_config_request;
+
fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
- mac->if_module->scheduled_response(&scheduled_response);
+ LOG_D(NR_MAC,"1# scheduled_response transmitted, %d, %d\n", rx_frame, rx_slot);
+ mac->if_module->scheduled_response(&scheduled_response);
}
else {
// this is for Msg2/Msg4
@@ -1201,6 +1214,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
fill_scheduled_response(&scheduled_response, NULL, ul_config, &tx_req, mod_id, cc_id, frame_tx, slot_tx, ul_info->thread_id, NULL);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
+ LOG_D(NR_MAC,"3# scheduled_response transmitted,%d, %d\n", frame_tx, slot_tx);
mac->if_module->scheduled_response(&scheduled_response);
}
pthread_mutex_lock(&ul_config->mutex_ul_config);
@@ -1543,7 +1557,9 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
uint8_t tda_id){
int delta = 0;
- NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+ NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+ NR_BWP_Uplink_t *ubwp = mac->ULbwp[ul_bwp_id-1];
+
// Get the numerology to calculate the Tx frame and slot
int mu = ubwp ?
ubwp->bwp_Common->genericParameters.subcarrierSpacing :
@@ -2381,9 +2397,17 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
NR_CSI_IM_Resource_t *imcsi;
int period, offset;
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
- int mu = mac->DLbwp[dl_bwp_id-1] ?
- mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
- mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing;
+
+ NR_BWP_t *genericParameters = NULL;
+ if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) {
+ genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters;
+ } else {
+ genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+ }
+
+ int mu = genericParameters->subcarrierSpacing;
+ uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
for (int id = 0; id < csi_measconfig->csi_IM_ResourceToAddModList->list.count; id++){
imcsi = csi_measconfig->csi_IM_ResourceToAddModList->list.array[id];
@@ -2391,11 +2415,8 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
if((frame*nr_slots_per_frame[mu]+slot-offset)%period != 0)
continue;
fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csiim_config_pdu.csiim_config_rel15;
- const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1];
- const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth:
- mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth;
- csiim_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE);
- csiim_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE);
+ csiim_config_pdu->bwp_size = bwp_size;
+ csiim_config_pdu->bwp_start = bwp_start;
csiim_config_pdu->subcarrier_spacing = mu;
csiim_config_pdu->start_rb = imcsi->freqBand->startingRB;
csiim_config_pdu->nr_of_rbs = imcsi->freqBand->nrofRBs;
@@ -2417,7 +2438,7 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
AssertFatal(1==0, "Invalid CSI-IM pattern\n");
}
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_IM;
- dl_config->number_pdus = dl_config->number_pdus + 1;
+ dl_config->number_pdus += 1;
}
}
@@ -2441,9 +2462,17 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
NR_NZP_CSI_RS_Resource_t *nzpcsi;
int period, offset;
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
- int mu = mac->DLbwp[dl_bwp_id-1] ?
- mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
- mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing;
+
+ NR_BWP_t *genericParameters = NULL;
+ if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) {
+ genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters;
+ } else {
+ genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+ }
+
+ int mu = genericParameters->subcarrierSpacing;
+ uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
@@ -2452,17 +2481,23 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
continue;
LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n",frame,slot);
fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csirs_config_pdu.csirs_config_rel15;
-
NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping;
-
- const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1];
- const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth:
- mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth;
- csirs_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE);
- csirs_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE);
csirs_config_pdu->subcarrier_spacing = mu;
- csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB;
- csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+ csirs_config_pdu->cyclic_prefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0;
+
+ // According to last paragraph of TS 38.214 5.2.2.3.1
+ if (resourceMapping.freqBand.startingRB < bwp_start) {
+ csirs_config_pdu->start_rb = bwp_start;
+ } else {
+ csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB;
+ }
+ if (resourceMapping.freqBand.nrofRBs > (bwp_start + bwp_size - csirs_config_pdu->start_rb)) {
+ csirs_config_pdu->nr_of_rbs = bwp_start + bwp_size - csirs_config_pdu->start_rb;
+ } else {
+ csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+ }
+ AssertFatal(csirs_config_pdu->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_config_pdu->nr_of_rbs);
+
csirs_config_pdu->csi_type = 1; // NZP-CSI-RS
csirs_config_pdu->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
if (resourceMapping.firstOFDMSymbolInTimeDomain2)
@@ -2473,6 +2508,11 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
&& (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
csirs_config_pdu->freq_density--;
csirs_config_pdu->scramb_id = nzpcsi->scramblingID;
+ csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8;
+ if (nzpcsi->powerControlOffsetSS)
+ csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
+ else
+ csirs_config_pdu->power_control_offset_ss = 1; // 0 dB
switch(resourceMapping.frequencyDomainAllocation.present){
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
csirs_config_pdu->row = 1;
@@ -2553,7 +2593,7 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
AssertFatal(1==0,"Invalid freqency domain allocation in CSI-RS resource\n");
}
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS;
- dl_config->number_pdus = dl_config->number_pdus + 1;
+ dl_config->number_pdus += 1;
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 9dff368ccc..19845c708b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -160,11 +160,10 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche
}
-void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts_t dl_antenna_ports_struct, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
+void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0];
RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon = scc;
- int pdsch_AntennaPorts = dl_antenna_ports_struct.N1 * dl_antenna_ports_struct.N2 * dl_antenna_ports_struct.XP;
// Carrier configuration
@@ -416,8 +415,8 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts
cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
- LOG_I(NR_MAC,"Set TX/RX antenna number to %d (num ssb %d: %x,%x)\n",
- cfg->carrier_config.num_tx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
+ LOG_I(NR_MAC,"Set RX antenna number to %d, Set TX antenna number to %d (num ssb %d: %x,%x)\n",
+ cfg->carrier_config.num_tx_ant.value,cfg->carrier_config.num_rx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,"carrier_config.num_tx_ant.value %d !\n",cfg->carrier_config.num_tx_ant.value );
cfg->num_tlv++;
cfg->num_tlv++;
@@ -456,18 +455,17 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_S
if (rrc_reconfiguration_delay == 0) {
return -1;
}
- const int UE_id = find_nr_UE_id(Mod_idP,rnti);
- if (UE_id < 0) {
+
+ NR_UE_info_t *UE_info = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info,rnti);
+ if (!UE_info) {
LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti);
return -1;
}
-
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl;
const uint16_t sf_ahead = 6/(0x01<0);
const uint16_t sl_ahead = sf_ahead * (0x01<rrc_processing_timer = (rrc_reconfiguration_delay<rnti, rrc_reconfiguration_delay);
return 0;
}
@@ -508,9 +506,11 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
LOG_I(NR_MAC,"Configuring common parameters from NR ServingCellConfig\n");
+ int num_pdsch_antenna_ports = pdsch_AntennaPorts.N1 * pdsch_AntennaPorts.N2 * pdsch_AntennaPorts.XP;
+ RC.nrmac[Mod_idP]->xp_pdsch_antenna_ports = pdsch_AntennaPorts.XP;
config_common(Mod_idP,
ssb_SubcarrierOffset,
- pdsch_AntennaPorts,
+ num_pdsch_antenna_ports,
pusch_AntennaPorts,
scc);
LOG_D(NR_MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
@@ -550,9 +550,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD,"Dynamic TDD not handled yet\n");
for (int slot = 0; slot < n; ++slot) {
- if (RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD ||
- (slot != 0))
- RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64);
+ RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64);
RC.nrmac[Mod_idP]->ulsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) >= nr_ulstart_slot) << (slot % 64);
LOG_I(NR_MAC, "In %s: slot %d DL %d UL %d\n",
@@ -590,37 +588,19 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
if (CellGroup) {
- if (get_softmodem_params()->sa) {
- calculate_preferred_dl_tda(Mod_idP, NULL);
- }
-
const NR_ServingCellConfig_t *servingCellConfig = NULL;
- if(CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated) {
+ if(CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated)
servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
- const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList;
- if(bwpList) {
- AssertFatal(bwpList->list.count > 0, "downlinkBWP_ToAddModList has no BWPs!\n");
- for (int i = 0; i < bwpList->list.count; ++i) {
- const NR_BWP_Downlink_t *bwp = bwpList->list.array[i];
- calculate_preferred_dl_tda(Mod_idP, bwp);
- }
- }
- const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList;
- if(ubwpList) {
- AssertFatal(ubwpList->list.count > 0, "uplinkBWP_ToAddModList no BWPs!\n");
- for (int i = 0; i < ubwpList->list.count; ++i) {
- const NR_BWP_Uplink_t *ubwp = ubwpList->list.array[i];
- calculate_preferred_ul_tda(Mod_idP, ubwp);
- }
- }
- }
-
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
if (add_ue == 1 && get_softmodem_params()->phy_test) {
- const int UE_id = add_new_nr_ue(Mod_idP, rnti, CellGroup);
- LOG_I(NR_MAC,"Added new UE_id %d/%x with initial CellGroup\n",UE_id,rnti);
- process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
+ NR_UE_info_t* UE = add_new_nr_ue(RC.nrmac[Mod_idP], rnti, CellGroup);
+ if (UE) {
+ LOG_I(NR_MAC,"Added new UE %x with initial CellGroup\n", rnti);
+ } else {
+ LOG_E(NR_MAC,"Error adding UE %04x\n", rnti);
+ return -1;
+ }
+ process_CellGroup(CellGroup,&UE->UE_sched_ctrl);
} else if (add_ue == 1 && !get_softmodem_params()->phy_test) {
const int CC_id = 0;
NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[CC_id];
@@ -667,12 +647,18 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
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;
- const int UE_id = find_nr_UE_id(Mod_idP,rnti);
+ NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info,rnti);
+ if (!UE) {
+ LOG_E(NR_MAC, "Can't find UE %04x\n", rnti);
+ return -1;
+ }
int target_ss;
- 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]);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+
+ UE->CellGroup = CellGroup;
+ LOG_I(NR_MAC,"Modified rnti %04x with CellGroup\n",rnti);
+ process_CellGroup(CellGroup,&UE->UE_sched_ctrl);
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
if (get_softmodem_params()->sa) {
// add all available DL HARQ processes for this UE in SA
@@ -695,7 +681,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
}
sched_ctrl->search_space = get_searchspace(sib1 ? sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL, scc, bwpd, target_ss);
- sched_ctrl->coreset = get_coreset(Mod_idP, scc, bwpd, sched_ctrl->search_space, target_ss);
+ sched_ctrl->coreset = get_coreset(RC.nrmac[Mod_idP], scc, bwpd, sched_ctrl->search_space, target_ss);
sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[Mod_idP],
sched_ctrl->search_space,
sched_ctrl->coreset,
@@ -703,12 +689,13 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
genericParameters,
RC.nrmac[Mod_idP]->type0_PDCCH_CSS_config);
sched_ctrl->maxL = 2;
+
if (CellGroup->spCellConfig &&
CellGroup->spCellConfig->spCellConfigDedicated &&
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
- CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup
- )
- compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, Mod_idP);
+ CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
+ compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE);
+ }
}
}
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 0c2fb683e9..d7e2c78c35 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -104,167 +104,6 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
TX_req[CC_idP].Number_of_PDUs = 0;
}
-/*
-void check_nr_ul_failure(module_id_t module_idP,
- int CC_id,
- int UE_id,
- frame_t frameP,
- sub_frame_t slotP) {
-
- NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info;
- nfapi_nr_dl_dci_request_t *DL_req = &RC.nrmac[module_idP]->DL_req[0];
- uint16_t rnti = UE_RNTI(module_idP, UE_id);
- NR_COMMON_channels_t *cc = RC.nrmac[module_idP]->common_channels;
-
- // check uplink failure
- if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0) &&
- (UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync == 0)) {
- LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti,
- UE_info->UE_sched_ctrl[UE_id].ul_failure_timer);
- if (UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) {
- UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1;
-
- // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
- nfapi_nr_dl_dci_request_pdu_t *dl_config_pdu = &DL_req[CC_id].dl_tti_request_body.dl_config_pdu_list[DL_req[CC_id].dl_tti_request_body.number_pdu];
- memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_dci_request_pdu_t));
- dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
- dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_DCI_REQUEST_DCI_DL_PDU_REL8_TAG;
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A;
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = get_aggregation(get_bw_index(module_idP, CC_id),
- UE_info->UE_sched_ctrl[UE_id].
- dl_cqi[CC_id], format1A);
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti;
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power
-
- AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6),
- "illegal dl_Bandwidth %d\n",
- (int) cc[CC_id].mib->message.dl_Bandwidth);
- dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = nr_pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth];
- DL_req[CC_id].dl_tti_request_body.number_dci++;
- DL_req[CC_id].dl_tti_request_body.number_pdu++;
- DL_req[CC_id].dl_tti_request_body.tl.tag = NFAPI_DL_TTI_REQUEST_BODY_TAG;
- LOG_I(MAC,
- "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n",
- UE_id, rnti,
- UE_info->UE_sched_ctrl[UE_id].ul_failure_timer,
- dl_config_pdu->dci_dl_pdu.
- dci_dl_pdu_rel8.resource_block_coding);
- } else { // ra_pdcch_sent==1
- LOG_I(MAC,
- "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",
- UE_id, rnti,
- UE_info->UE_sched_ctrl[UE_id].ul_failure_timer);
- if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer % 40) == 0) UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 4 frames
- }
-
- UE_info->UE_sched_ctrl[UE_id].ul_failure_timer++;
- // check threshold
- if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 20000) {
- // inform RRC of failure and clear timer
- LOG_I(MAC,
- "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",
- UE_id, rnti);
- mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP,rnti);
- UE_info->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
- UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync = 1;
-
- //Inform the controller about the UE deactivation. Should be moved to RRC agent in the future
- if (rrc_agent_registered[module_idP]) {
- LOG_W(MAC, "notify flexran Agent of UE state change\n");
- agent_rrc_xface[module_idP]->flexran_agent_notify_ue_state_change(module_idP,
- rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
- }
- }
- } // ul_failure_timer>0
-
-}
-*/
-/*
-void schedule_nr_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
-{
- gNB_MAC_INST *gNB = RC.nrmac[module_idP];
- NR_UE_info_t *UE_info = &gNB->UE_info;
- nfapi_ul_config_request_body_t *ul_req;
- int CC_id, UE_id;
- NR_COMMON_channels_t *cc = RC.nrmac[module_idP]->common_channels;
- SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon;
- struct SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated;
- uint8_t TSFC;
- uint16_t deltaTSFC; // bitmap
- uint8_t srs_SubframeConfig;
-
- // table for TSFC (Period) and deltaSFC (offset)
- const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD
- const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD
-
- uint16_t srsPeriodicity, srsOffset;
-
- for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
- soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon;
- // check if SRS is enabled in this frame/subframe
- if (soundingRS_UL_ConfigCommon) {
- srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig;
- if (cc[CC_id].tdd_Config == NULL) { // FDD
- deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0];
- TSFC = deltaTSFCTabType1[srs_SubframeConfig][1];
- } else { // TDD
- deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0];
- TSFC = deltaTSFCTabType2[srs_SubframeConfig][1];
- }
- // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC
- uint16_t tmp = (subframeP % TSFC);
-
- if ((1 << tmp) & deltaTSFC) {
- // This is an SRS subframe, loop over UEs
- for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) {
- if (!RC.nrmac[module_idP]->UE_info.active[UE_id]) continue;
- ul_req = &RC.nrmac[module_idP]->UL_req[CC_id].ul_config_request_body;
- // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet
- if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
-
- AssertFatal(UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL,
- "physicalConfigDedicated is null for UE %d\n",
- UE_id);
-
- if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) {
- if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
- get_srs_pos(&cc[CC_id],
- soundingRS_UL_ConfigDedicated->choice.
- setup.srs_ConfigIndex,
- &srsPeriodicity, &srsOffset);
- if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) {
- // Program SRS
- ul_req->srs_present = 1;
- nfapi_ul_config_request_pdu_t * ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
- memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
- ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE;
- ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu));
- ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu);
- ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_info->UE_template[CC_id][UE_id].rnti;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
- ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;//
- // ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;//
- RC.nrmac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
- RC.nrmac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST;
- ul_req->number_of_pdus++;
- } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset)
- } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup)
- } // if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL)
- } // for (UE_id ...
- } // if((1<=64) return false; //quickfix for FR2 where there are more than 64 slots (bitmap to be removed)
@@ -348,6 +187,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
nr_mac_update_timers(module_idP, frame, slot);
+ schedule_nr_bwp_switch(module_idP, frame, slot);
+
// This schedules MIB
schedule_nr_mib(module_idP, frame, slot);
@@ -370,7 +211,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
schedule_nr_prach(module_idP, f, s);
}
-
// Schedule CSI-RS transmission
nr_csirs_scheduling(module_idP, frame, slot, nr_slots_per_frame[*scc->ssbSubcarrierSpacing]);
@@ -396,10 +236,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
nr_schedule_ue_spec(module_idP, frame, slot);
stop_meas(&gNB->schedule_dlsch);
- nr_schedule_pucch(module_idP, frame, slot);
+ nr_schedule_pucch(RC.nrmac[module_idP], frame, slot);
// This schedule SR after PUCCH for multiplexing
- nr_sr_reporting(module_idP, frame, slot);
+ nr_sr_reporting(RC.nrmac[module_idP], frame, slot);
stop_meas(&RC.nrmac[module_idP]->eNB_scheduler);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index c9c3b2e289..eb05ec5e83 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -465,27 +465,24 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
int FR = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257 ? nr_FR2 : nr_FR1;
- uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
- *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
- *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
+ uint8_t start_next_period = rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot;
+ int eff_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
// we can't schedule msg2 before sl_ahead since prach
- int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
while ((eff_slot-rach_slot)<=sl_ahead) {
- *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
- *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
- eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
+ eff_slot += tdd_period_slot;
}
if (FR==nr_FR2) {
- int num_tdd_period = *msg2_slot/tdd_period_slot;
+ int num_tdd_period = (eff_slot%nr_slots_per_frame[mu])/tdd_period_slot;
while((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=beam_index)) {
- *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
- *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
- num_tdd_period = *msg2_slot/tdd_period_slot;
+ eff_slot += tdd_period_slot;
+ num_tdd_period = (eff_slot % nr_slots_per_frame[mu])/tdd_period_slot;
}
if(tdd_beam_association[num_tdd_period] == -1)
tdd_beam_association[num_tdd_period] = beam_index;
}
+ *msg2_frame=(rach_frame + eff_slot/nr_slots_per_frame[mu])%1024;
+ *msg2_slot=eff_slot%nr_slots_per_frame[mu];
// go to previous slot if the current scheduled slot is beyond the response window
// and if the slot is not among the PDCCH monitored ones (38.213 10.1)
while (*msg2_frame > frame_limit
@@ -542,8 +539,10 @@ void nr_initiate_ra_proc(module_id_t module_idP,
for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
NR_RA_t *ra = &cc->ra[i];
pr_found = 0;
- const int UE_id = find_nr_UE_id(module_idP, ra->rnti);
- if (UE_id != -1) {
+ const NR_UE_info_t * UE = find_nr_UE(&nr_mac->UE_info, ra->rnti);
+ if (UE) {
+ // the UE is already registered
+ LOG_W(NR_MAC, "Received RA for existing RNTI %04x\n", ra->rnti);
continue;
}
if (ra->state == RA_IDLE) {
@@ -571,13 +570,19 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
// This should be handled differently when we use the initialBWP for RA
- ra->bwp_id = 0;
+ ra->dl_bwp_id = 0;//TODO
+ ra->ul_bwp_id = 0;
NR_BWP_Downlink_t *bwp=NULL;
- if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated &&
+ if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated) {
+ if (ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id &&
ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
- ra->bwp_id = 1;
- bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
- }
+ ra->dl_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id;
+ bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id - 1];
+ }
+ if (ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+ ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)
+ ra->ul_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id;
+ }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
@@ -631,7 +636,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
AssertFatal(ra->ra_ss!=NULL,"SearchSpace cannot be null for RA\n");
- ra->coreset = get_coreset(module_idP, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common);
+ ra->coreset = get_coreset(nr_mac, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common);
ra->sched_pdcch = set_pdcch_structure(nr_mac,
ra->ra_ss,
ra->coreset,
@@ -666,7 +671,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra->rnti = (taus() % 65518) + 1;
loop++;
} while (loop != 100
- && !((find_nr_UE_id(module_idP, ra->rnti) == -1) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
+ && !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
&& ra->rnti >= 1 && ra->rnti <= 65519));
if (loop == 100) {
LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
@@ -679,7 +684,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra->beam_id = beam_index;
LOG_I(NR_MAC,
- "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB "
+ "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB, new rnti %04x "
"index %u RA index %d\n",
module_idP,
CC_id,
@@ -687,6 +692,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra->Msg2_frame,
ra->Msg2_slot,
ra->RA_rnti,
+ ra->rnti,
cc->ssb_index[beam_index],
i);
@@ -741,7 +747,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
NR_BWP_t *genericParameters = NULL;
if(ra->CellGroup) {
- ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+ ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id-1];
ubwpd = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
genericParameters = &ubwp->bwp_Common->genericParameters;
pusch_TimeDomainAllocationList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
@@ -888,7 +894,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
ra->Msg3_tda_id,
ra->msg3_TPC,
0, // not used in format 0_0
- ra->bwp_id);
+ ra->ul_bwp_id);
fill_dci_pdu_rel15(scc,
ra->CellGroup,
@@ -897,7 +903,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
NR_UL_DCI_FORMAT_0_0,
NR_RNTI_TC,
pusch_pdu->bwp_size,
- ra->bwp_id,
+ ra->ul_bwp_id,
+ coresetid,
nr_mac->cset0_bwp_size);
// Mark the corresponding RBs as used
@@ -1012,9 +1019,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
if (ra->CellGroup) {
- AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
- "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
- NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+ NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1];
int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
int act_bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
if (!((bwpStart >= act_bwp_start) && ((bwpStart+bwpSize) <= (act_bwp_start+act_bwp_size))))
@@ -1104,10 +1109,11 @@ void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
int TBS = 0;
while(TBS<7) { // TBS for msg3 is 7 bytes (except for RRCResumeRequest1 currently not implemented)
mcsindex++;
- pusch_pdu->target_code_rate = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table);
+ int R = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table);
+ pusch_pdu->target_code_rate = R;
pusch_pdu->qam_mod_order = nr_get_Qm_ul(mcsindex,pusch_pdu->mcs_table);
TBS = nr_compute_tbs(pusch_pdu->qam_mod_order,
- pusch_pdu->target_code_rate,
+ R,
pusch_pdu->rb_size,
pusch_pdu->nr_of_symbols,
num_dmrs_symb*12, // nb dmrs set for no data in dmrs symbol
@@ -1164,9 +1170,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
if (ra->CellGroup) {
- AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
- "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
- NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+ NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1];
startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
@@ -1197,20 +1201,13 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
nr_fill_rar(module_idP, ra, RAR_pdu, pusch_pdu);
}
-void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra)
-{
+void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra) {
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) {
- //TODO time domain assignment for msg2 needs to be improved
- uint8_t time_domain_assignment;
- if(cc->frame_type == TDD)
- time_domain_assignment = 1;
- else
- time_domain_assignment = 0;
int mcsIndex = -1; // initialization value
int rbStart = 0;
int rbSize = 8;
@@ -1227,8 +1224,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
ra->CellGroup->spCellConfig &&
ra->CellGroup->spCellConfig->spCellConfigDedicated &&
ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
- ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
- bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+ ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) {
+ bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1];
genericParameters = &bwp->bwp_Common->genericParameters;
pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
}
@@ -1250,6 +1247,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
}
// Calculate number of symbols
+ int time_domain_assignment = get_dl_tda(nr_mac, scc, slotP);
int startSymbolIndex, nrOfSymbols;
const int startSymbolAndLength = pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
@@ -1389,7 +1387,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position,
nrOfSymbols,
startSymbolIndex,
- mappingtype, 1);
+ mappingtype,
+ 1);
uint8_t tb_scaling = 0;
int R, Qm;
@@ -1482,6 +1481,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
NR_RNTI_RA,
BWPSize,
bwpid,
+ coresetid,
nr_mac->cset0_bwp_size);
// DL TX request
@@ -1489,7 +1489,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// Program UL processing for Msg3
NR_BWP_Uplink_t *ubwp = ra->CellGroup ?
- ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1] :
+ ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1] :
NULL;
nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra, nr_mac->tdd_beam_association);
nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]);
@@ -1521,7 +1521,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
}
ra->state = WAIT_Msg3;
- LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
+ LOG_W(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: rnti %04x RA state %d\n", module_idP, frameP, slotP, ra->rnti, ra->state);
}
}
@@ -1546,8 +1546,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
ra->CellGroup->spCellConfig &&
ra->CellGroup->spCellConfig->spCellConfigDedicated &&
ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
- ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
- bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+ ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) {
+ bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1];
pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
}
else {
@@ -1564,9 +1564,14 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
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];
+ NR_UE_info_t * UE = find_nr_UE(&nr_mac->UE_info, ra->rnti);
+ if (!UE) {
+ LOG_E(NR_MAC,"want to generate Msg4, but rnti %04x not in the table\n", ra->rnti);
+ return;
+ }
+
+ LOG_I(NR_MAC,"Generate msg4, rnti: %04x\n", ra->rnti);
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_BWP_t *genericParameters = bwp ? & bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
@@ -1599,7 +1604,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// Remove UE associated to TC-RNTI
if(harq->round==0 && ra->msg3_dcch_dtch) {
- mac_remove_nr_ue(module_idP, tc_rnti);
+ mac_remove_nr_ue(nr_mac, tc_rnti);
}
// get CCEindex, needed also for PUCCH and then later for PDCCH
@@ -1630,7 +1635,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, nb_of_candidates %d, delta_PRI %d)\n", r_pucch, CCEIndex, nr_of_candidates, delta_PRI);
- int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch, 1);
+ int alloc = nr_acknack_scheduling(module_idP, UE, frameP, slotP, r_pucch, 1);
AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n");
NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc];
harq->feedback_slot = pucch->ul_slot;
@@ -1646,13 +1651,25 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
} 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);
+ uint8_t buffer[CCCH_SDU_SIZE];
+ uint8_t mac_subheader_len = sizeof(NR_MAC_SUBHEADER_SHORT);
+ uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, buffer);
+ if (mac_sdu_length < 256) {
+ ((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);
+ } else {
+ mac_subheader_len = sizeof(NR_MAC_SUBHEADER_LONG);
+ ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->R = 0;
+ ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->F = 1;
+ ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+ ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->L = htons(mac_sdu_length);
+ ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_LONG);
+ }
+ LOG_I(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, mac_subheader_len, ra->mac_pdu_length);
+ memcpy(&buf[mac_pdu_length + mac_subheader_len], buffer, mac_sdu_length);
}
}
@@ -1668,7 +1685,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
scc->dmrs_TypeA_Position,
nrOfSymbols,
startSymbolIndex,
- mappingtype, 1);
+ mappingtype,
+ 1);
uint16_t N_DMRS_SLOT = get_num_dmrs(dlDmrsSymbPos);
@@ -1721,6 +1739,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3;
} while (harq->tb_size < ra->mac_pdu_length && mcsIndex<=28);
+ AssertFatal(harq->tb_size >= ra->mac_pdu_length,"Cannot allocate Msg4\n");
+
int i = 0;
while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
if (vrb_map[BWPStart + rbStart + i]&SL_to_bitmap(startSymbolIndex, nrOfSymbols)) {
@@ -1781,7 +1801,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
pdsch_pdu_rel15->SubcarrierSpacing = genericParameters->subcarrierSpacing;
pdsch_pdu_rel15->CyclicPrefix = 0;
pdsch_pdu_rel15->NrOfCodewords = 1;
- pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx);
+ int R = nr_get_code_rate_dl(mcsIndex,mcsTableIdx);
+ pdsch_pdu_rel15->targetCodeRate[0] = R;
pdsch_pdu_rel15->qamModOrder[0] = 2;
pdsch_pdu_rel15->mcsIndex[0] = mcsIndex;
pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx;
@@ -1877,6 +1898,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
NR_RNTI_TC,
pdsch_pdu_rel15->BWPSize,
bwpid,
+ coresetid,
nr_mac->cset0_bwp_size);
// Add padding header and zero rest out if there is space left
@@ -1930,10 +1952,9 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
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);
+ LOG_I(NR_MAC, "(ue rnti 0x%04x) CBRA procedure succeeded!\n", 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;
+ UE->Msg4_ACKed = true;
remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
harq->feedback_slot = -1;
@@ -1950,41 +1971,45 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) {
- int UE_id = find_nr_UE_id(module_id, ra->rnti);
+ NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, ra->rnti);
const int current_harq_pid = ra->harq_pid;
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
- NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+ NR_mac_stats_t *stats = &UE->mac_stats;
- 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);
+ LOG_D(NR_MAC, "ue rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", 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);
- UE_info->active[UE_id] = true;
- UE_info->Msg4_ACKed[UE_id] = true;
- const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
- NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
- RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
- sib1);
+ if (stats->dl.errors == 0) {
+ LOG_A(NR_MAC, "(UE RNTI 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti);
+ UE->Msg4_ACKed = true;
+
+ // Pause scheduling according to:
// 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
- sched_ctrl->rrc_processing_timer = (NR_RRC_SETUP_DELAY_MS << genericParameters->subcarrierSpacing); // RRCSetup 10 ms
- }
- else {
- LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
+ const NR_COMMON_channels_t *common_channels = &RC.nrmac[module_id]->common_channels[0];
+ const NR_SIB1_t *sib1 = common_channels->sib1 ? common_channels->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ const NR_ServingCellConfig_t *servingCellConfig = UE->CellGroup ? UE->CellGroup->spCellConfig->spCellConfigDedicated : NULL;
+ NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
+ common_channels->ServingCellConfigCommon,
+ sib1);
+ uint32_t delay_ms = servingCellConfig && servingCellConfig->downlinkBWP_ToAddModList ?
+ NR_RRC_SETUP_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_SETUP_DELAY_MS;
+
+ sched_ctrl->rrc_processing_timer = (delay_ms << genericParameters->subcarrierSpacing);
+ LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frame, slot, UE->rnti, delay_ms);
+ } else {
+ LOG_I(NR_MAC, "(ue rnti 0x%04x) RA Procedure failed at Msg4!\n", ra->rnti);
}
nr_clear_ra_proc(module_id, CC_id, frame, ra);
- if(sched_ctrl->retrans_dl_harq.head >= 0) {
+ if (sched_ctrl->retrans_dl_harq.head >= 0) {
remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
}
- }
- else {
- LOG_D(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
+ } else {
+ LOG_I(NR_MAC, "(UE %04x) Received Nack of RA-Msg4. Preparing retransmission!\n", ra->rnti);
ra->Msg4_frame = (frame + 1) % 1024;
ra->Msg4_slot = 1;
ra->state = Msg4;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index b4ba1063f1..e2ceadb889 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -552,6 +552,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
rnti_type,
pdsch_pdu_rel15->BWPSize,
0,
+ 0,
gNB_mac->cset0_bwp_size);
LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index dc4aae2fe3..4b71b40662 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -53,105 +53,21 @@
#define WORD 32
//#define SIZE_OF_POINTER sizeof (void *)
-void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp) {
- gNB_MAC_INST *nrmac = RC.nrmac[module_id];
- const int bwp_id = bwp ? bwp->bwp_Id : 0;
+const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) {
- if (nrmac->preferred_dl_tda[bwp_id])
- return;
+ const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+ AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
- /* there is a mixed slot only when in TDD */
- NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
- frame_type_t frame_type = nrmac->common_channels->frame_type;
- const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- const NR_TDD_UL_DL_Pattern_t *tdd =
- scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
- int symb_dlMixed = 0;
- int nr_mix_slots = 0;
- int nr_slots_period = n;
+ // Use special TDA in case of CSI-RS
+ if(nrmac->UE_info.sched_csirs)
+ return 1;
- if (tdd) {
- symb_dlMixed = (1 << tdd->nrofDownlinkSymbols) - 1;
- nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0;
- nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
- } else
- // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration
- AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n");
-
- int target_ss;
-
- if (bwp) {
- target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- } else {
- target_ss = NR_SearchSpace__searchSpaceType_PR_common;
- }
-
- const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
- NR_SearchSpace_t *search_space = get_searchspace(sib1,
- scc,
- bwp ? bwp->bwp_Dedicated : NULL,
- target_ss);
-
- NR_ControlResourceSet_t *coreset = get_coreset(module_id, scc, bwp ? bwp->bwp_Dedicated : NULL, search_space, target_ss);
- // get coreset symbol "map"
- const uint16_t symb_coreset = (1 << coreset->duration) - 1;
-
- NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp,
- scc,
- sib1);
- AssertFatal(tdaList->list.count >= 1, "need to have at least one TDA for DL slots\n");
-
- /* check that TDA index 0 fits into DL and does not overlap CORESET */
- const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_DL = tdaList->list.array[0];
- AssertFatal(!tdaP_DL->k0 || *tdaP_DL->k0 == 0,
- "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n",
- *tdaP_DL->k0);
- int start, len;
- SLIV2SL(tdaP_DL->startSymbolAndLength, &start, &len);
- const uint16_t symb_tda = ((1 << len) - 1) << start;
- // check whether coreset and TDA overlap: then we cannot use it. Note that
- // here we assume that the coreset is scheduled every slot (which it
- // currently is) and starting at symbol 0
- AssertFatal((symb_coreset & symb_tda) == 0, "TDA index 0 for DL overlaps with CORESET\n");
- /* check that TDA index 1 fits into DL part of mixed slot, if it exists */
- int tdaMi = -1;
-
- if (frame_type == TDD && tdaList->list.count > 1) {
- const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1];
- AssertFatal(!tdaP_Mi->k0 || *tdaP_Mi->k0 == 0,
- "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n",
- *tdaP_Mi->k0);
- int start, len;
- SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len);
- const uint16_t symb_tda = ((1 << len) - 1) << start;
-
- // check whether coreset and TDA overlap: then, we cannot use it. Also,
- // check whether TDA is entirely within mixed slot DL. Note that
- // here we assume that the coreset is scheduled every slot (which it
- // currently is)
- if ((symb_coreset & symb_tda) == 0 && (symb_dlMixed & symb_tda) == symb_tda) {
- tdaMi = 1;
- } else {
- LOG_E(MAC,
- "TDA index 1 DL overlaps with CORESET or is not entirely in mixed slot (symb_coreset %x symb_dlMixed %x symb_tda %x), won't schedule DL mixed slot\n",
- symb_coreset,
- symb_dlMixed,
- symb_tda);
- }
- }
-
- nrmac->preferred_dl_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_dl_tda[bwp_id]));
-
- for (int i = 0; i < n; ++i) {
- nrmac->preferred_dl_tda[bwp_id][i] = -1;
-
- if (frame_type == FDD || i % nr_slots_period < tdd->nrofDownlinkSlots)
- nrmac->preferred_dl_tda[bwp_id][i] = 0;
- else if (nr_mix_slots && i % nr_slots_period == tdd->nrofDownlinkSlots)
- nrmac->preferred_dl_tda[bwp_id][i] = tdaMi;
-
- LOG_D(MAC, "slot %d preferred_dl_tda %d\n", i, nrmac->preferred_dl_tda[bwp_id][i]);
+ if (tdd && tdd->nrofDownlinkSymbols > 1) { // if there is a mixed slot where we can transmit DL
+ const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1;
+ if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots)
+ return 2;
}
+ return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
}
// Compute and write all MAC CEs and subheaders, and return number of written
@@ -397,88 +313,12 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP,
return offset;
}
-#define BLER_UPDATE_FRAME 10
-#define BLER_FILTER 0.9f
-int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id, int mcs_table) {
- gNB_MAC_INST *nrmac = RC.nrmac[mod_id];
- const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
- const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- int max_allowed_mcs = (mcs_table == 1) ? 27 : 28;
- int max_mcs = nrmac->dl_max_mcs;
-
- if (nrmac->dl_max_mcs>max_allowed_mcs)
- max_mcs = max_allowed_mcs;
-
- NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats;
-
- /* first call: everything is zero. Initialize to sensible default */
- if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) {
- bler_stats->last_frame_slot = frame * n + slot;
- bler_stats->mcs = 9;
- bler_stats->bler = (nrmac->dl_bler_target_lower + nrmac->dl_bler_target_upper) / 2;
- bler_stats->rd2_bler = nrmac->dl_rd2_bler_threshold;
- }
-
- const int now = frame * n + slot;
- int diff = now - bler_stats->last_frame_slot;
-
- if (diff < 0) // wrap around
- diff += 1024 * n;
-
- const uint8_t old_mcs = bler_stats->mcs;
- const NR_mac_stats_t *stats = &nrmac->UE_info.mac_stats[UE_id];
-
- // TODO put back this condition when relevant
- /*const int dret3x = stats->dlsch_rounds[3] - bler_stats->dlsch_rounds[3];
- if (dret3x > 0) {
- if there is a third retransmission, decrease MCS for stabilization and
- restart averaging window to stabilize transmission
- bler_stats->last_frame_slot = now;
- bler_stats->mcs = max(9, bler_stats->mcs - 1);
- memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds));
- LOG_D(MAC, "%4d.%2d: %d retx in 3rd round, setting MCS to %d and restarting window\n", frame, slot, dret3x, bler_stats->mcs);
- return bler_stats->mcs;
- }*/
- if (diff < BLER_UPDATE_FRAME * n)
- return old_mcs; // no update
-
- // last update is longer than x frames ago
- const int dtx = (int)(stats->dlsch_rounds[0] - bler_stats->dlsch_rounds[0]);
- const int dretx = (int)(stats->dlsch_rounds[1] - bler_stats->dlsch_rounds[1]);
- const int dretx2 = (int)(stats->dlsch_rounds[2] - bler_stats->dlsch_rounds[2]);
- const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler;
- const float rd2_bler_wnd = dtx > 0 ? (float) dretx2 / dtx : bler_stats->rd2_bler;
- bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window;
- bler_stats->rd2_bler = BLER_FILTER / 4 * bler_stats->rd2_bler + (1 - BLER_FILTER / 4) * rd2_bler_wnd;
- int new_mcs = old_mcs;
-
- // TODO put back this condition when relevant
- /* first ensure that number of 2nd retx is below threshold. If this is the
- * case, use 1st retx to adjust faster
- if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) {
- new_mcs -= 2;
- } else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/
- if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9)
- new_mcs += 1;
- else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6)
- new_mcs -= 1;
-
- // else we are within threshold boundaries
- bler_stats->last_frame_slot = now;
- bler_stats->mcs = new_mcs;
- memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds));
- LOG_D(MAC, "%4d.%2d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f, dretx2 %d, RD2 BLER wnd %.3f avg %.6f)\n",
- frame, slot, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler, dretx2, rd2_bler_wnd, bler_stats->rd2_bler);
- return new_mcs;
-}
-
void nr_store_dlsch_buffer(module_id_t module_id,
frame_t frame,
sub_frame_t slot) {
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
- for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
sched_ctrl->num_total_bytes = 0;
sched_ctrl->dl_pdus_total = 0;
@@ -486,13 +326,11 @@ void nr_store_dlsch_buffer(module_id_t module_id,
// Note: DL_SCH_LCID_DCCH, DL_SCH_LCID_DCCH1, DL_SCH_LCID_DTCH
for (int i = 0; i < sched_ctrl->dl_lc_num; ++i) {
const int lcid = sched_ctrl->dl_lc_ids[i];
- const uint16_t rnti = UE_info->rnti[UE_id];
- LOG_D(NR_MAC, "In %s: UE %d/%x: LCID %d\n", __FUNCTION__, UE_id, rnti, lcid);
-
+ const uint16_t rnti = UE->rnti;
+ LOG_D(NR_MAC, "In %s: UE %x: LCID %d\n", __FUNCTION__, rnti, lcid);
if (lcid == DL_SCH_LCID_DTCH && sched_ctrl->rrc_processing_timer > 0) {
continue;
}
-
start_meas(&RC.nrmac[module_id]->rlc_status_ind);
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
rnti,
@@ -518,7 +356,7 @@ void nr_store_dlsch_buffer(module_id_t module_id,
slot,
lcid < 4 ? "DCCH":"DTCH",
lcid,
- UE_id,
+ UE->rnti,
sched_ctrl->rlc_status[lcid].bytes_in_buffer,
sched_ctrl->num_total_bytes,
sched_ctrl->dl_pdus_total,
@@ -532,16 +370,14 @@ bool allocate_dl_retransmission(module_id_t module_id,
sub_frame_t slot,
uint16_t *rballoc_mask,
int *n_rb_sched,
- int UE_id,
+ NR_UE_info_t *UE,
int current_harq_pid) {
-
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels->ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_sched_pdsch_t *retInfo = &sched_ctrl->harq_processes[current_harq_pid].sched_pdsch;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_BWP_DownlinkDedicated_t *bwpd =
cg &&
@@ -567,7 +403,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
int rbStart = 0; // start wrt BWPstart
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
int rbSize = 0;
- const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot];
+ const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n");
if (tda == retInfo->time_domain_allocation) {
@@ -581,7 +417,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
rbStart++;
if (rbStart >= bwpSize) {
- LOG_D(NR_MAC, "cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", UE_id, UE_info->rnti[UE_id]);
+ LOG_D(NR_MAC, "cannot allocate retransmission for RNTI %04x: no resources\n", UE->rnti);
return false;
}
@@ -654,7 +490,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
/* Find a free CCE */
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, UE->rnti);
uint8_t nr_of_candidates;
for (int i=0; i<5; i++) {
@@ -676,8 +512,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
Y);
if (CCEIndex<0) {
- LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission UE %d/RNTI %04x\n",
- frame, slot, UE_id, UE_info->rnti[UE_id]);
+ LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission RNTI %04x\n",
+ frame, slot, UE->rnti);
return false;
}
@@ -685,12 +521,11 @@ bool allocate_dl_retransmission(module_id_t module_id,
* allocation after CCE alloc fail would be more complex) */
int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+ const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0);
if (alloc<0) {
LOG_D(MAC,
- "could not find PUCCH for UE %d/%04x@%d.%d\n",
- UE_id,
- UE_info->rnti[UE_id],
+ "could not find PUCCH for UE %04x@%d.%d\n",
+ UE->rnti,
frame,
slot);
RC.nrmac[module_id]->pdcch_cand[cid]--;
@@ -716,48 +551,54 @@ bool allocate_dl_retransmission(module_id_t module_id,
return true;
}
-float thr_ue[MAX_MOBILES_PER_GNB];
uint32_t pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient
+typedef struct UEsched_s {
+ float coef;
+ NR_UE_info_t * UE;
+} UEsched_t;
+
+static int comparator(const void *p, const void *q) {
+ return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
+}
void pf_dl(module_id_t module_id,
frame_t frame,
sub_frame_t slot,
- NR_list_t *UE_list,
+ NR_UE_info_t **UE_list,
int max_num_ue,
int n_rb_sched,
uint16_t *rballoc_mask) {
gNB_MAC_INST *mac = RC.nrmac[module_id];
- NR_UE_info_t *UE_info = &mac->UE_info;
NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon;
- float coeff_ue[MAX_MOBILES_PER_GNB];
// UEs that could be scheduled
- int ue_array[MAX_MOBILES_PER_GNB];
- int layers[MAX_MOBILES_PER_GNB];
- NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB };
+ UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
+ int remainUEs = max_num_ue;
+ int curUE = 0;
/* Loop UE_info->list to check retransmission */
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- if (UE_info->Msg4_ACKed[UE_id] != true) continue;
+ UE_iterator(UE_list, UE) {
+ if (UE->Msg4_ACKed != true)
+ continue;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue;
+ const NR_mac_dir_stats_t *stats = &UE->mac_stats.dl;
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
/* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
sched_pdsch->dl_harq_pid = sched_ctrl->retrans_dl_harq.head;
- layers[UE_id] = ps->nrOfLayers; // initialization of layers to the previous value in the strcuture
+ UE->layers = ps->nrOfLayers; // initialization of layers to the previous value in the structure
/* Calculate Throughput */
const float a = 0.0005f; // corresponds to 200ms window
- const uint32_t b = UE_info->mac_stats[UE_id].dlsch_current_bytes;
- thr_ue[UE_id] = (1 - a) * thr_ue[UE_id] + a * b;
+ const uint32_t b = UE->mac_stats.dl.current_bytes;
+ UE->dl_thr_ue = (1 - a) * UE->dl_thr_ue + a * b;
/* retransmission */
if (sched_pdsch->dl_harq_pid >= 0) {
/* Allocate retransmission */
- bool r = allocate_dl_retransmission(
- module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pdsch->dl_harq_pid);
+ bool r = allocate_dl_retransmission(module_id, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pdsch->dl_harq_pid);
if (!r) {
LOG_D(NR_MAC, "%4d.%2d retransmission can NOT be allocated\n", frame, slot);
@@ -765,18 +606,24 @@ void pf_dl(module_id_t module_id,
}
/* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
- max_num_ue--;
+ remainUEs--;
+
+ // we have filled all with mandatory retransmissions
+ // no need to schedule new transmissions
+ if (remainUEs == 0)
+ return;
- if (max_num_ue < 0) return;
} else {
/* Check DL buffer and skip this UE if no bytes and no TA necessary */
if (sched_ctrl->num_total_bytes == 0 && frame != (sched_ctrl->ta_frame + 10) % 1024)
continue;
/* Calculate coeff */
- set_dl_mcs(sched_pdsch,sched_ctrl,&mac->dl_max_mcs,ps->mcsTableIdx);
- sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx);
- layers[UE_id] = set_dl_nrOfLayers(sched_ctrl);
+ const NR_bler_options_t *bo = &mac->dl_bler;
+ const int max_mcs_table = ps->mcsTableIdx == 1 ? 27 : 28;
+ const int max_mcs = min(sched_ctrl->dl_max_mcs, max_mcs_table);
+ sched_pdsch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->dl_bler_stats, max_mcs, frame);
+ UE->layers = set_dl_nrOfLayers(sched_ctrl);
const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
uint32_t tbs = nr_compute_tbs(Qm,
@@ -786,40 +633,26 @@ void pf_dl(module_id_t module_id,
0, /* N_PRB_DMRS * N_DMRS_SLOT */
0 /* N_PRB_oh, 0 for initialBWP */,
0 /* tb_scaling */,
- layers[UE_id]) >> 3;
- coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id];
- LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
- b, UE_id, thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]);
+ UE->layers) >> 3;
+ float coeff_ue = (float) tbs / UE->dl_thr_ue;
+ LOG_D(NR_MAC,"UE %04x b %d, thr_ue %f, tbs %d, coeff_ue %f\n",
+ UE->rnti, b, UE->dl_thr_ue, tbs, coeff_ue);
/* Create UE_sched list for UEs eligible for new transmission*/
- add_tail_nr_list(&UE_sched, UE_id);
+ UE_sched[curUE].coef=coeff_ue;
+ UE_sched[curUE].UE=UE;
+ curUE++;
}
}
+ qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator);
+ UEsched_t *iterator = UE_sched;
+
const int min_rbSize = 5;
/* Loop UE_sched to find max coeff and allocate transmission */
- while (max_num_ue > 0 && n_rb_sched >= min_rbSize && UE_sched.head >= 0) {
- /* Find max coeff from UE_sched*/
- int *max = &UE_sched.head; /* assume head is max */
- int *p = &UE_sched.next[*max];
-
- while (*p >= 0) {
- /* if the current one has larger coeff, save for later */
- if (coeff_ue[*p] > coeff_ue[*max])
- max = p;
-
- p = &UE_sched.next[*p];
- }
-
- /* remove the max one: do not use remove_nr_list() it goes through the
- * whole list every time. Note that UE_sched.tail might not be set
- * correctly anymore */
- const int UE_id = *max;
- p = &UE_sched.next[*max];
- *max = UE_sched.next[*max];
- *p = -1;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) {
+ NR_CellGroupConfig_t *cg = iterator->UE->CellGroup;
NR_BWP_DownlinkDedicated_t *bwpd =
cg &&
@@ -834,26 +667,33 @@ void pf_dl(module_id_t module_id,
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- const uint16_t rnti = UE_info->rnti[UE_id];
- const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
+ const uint16_t rnti = iterator->UE->rnti;
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ?
+ RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 :
+ NULL;
NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
sib1);
- const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
- const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ const int coresetid = (sched_ctrl->active_bwp||bwpd) ?
+ sched_ctrl->coreset->controlResourceSetId :
+ RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
+ const uint16_t bwpSize = coresetid == 0 ?
+ RC.nrmac[module_id]->cset0_bwp_size :
+ NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
int rbStart = 0; // start wrt BWPstart
if (sched_ctrl->available_dl_harq.head < 0) {
- LOG_D(MAC, "UE %d RNTI %04x has no free HARQ process, skipping\n", UE_id, UE_info->rnti[UE_id]);
+ LOG_D(MAC, "RNTI %04x has no free HARQ process, skipping\n", iterator->UE->rnti);
+ iterator++;
continue;
}
/* Find a free CCE */
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, iterator->UE->rnti);
uint8_t nr_of_candidates;
for (int i=0; i<5; i++) {
@@ -875,7 +715,8 @@ void pf_dl(module_id_t module_id,
Y);
if (CCEIndex<0) {
- LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI UE %d/RNTI %04x\n", frame, slot, UE_id, rnti);
+ LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI RNTI %04x\n", frame, slot, rnti);
+ iterator++;
continue;
}
@@ -883,48 +724,40 @@ void pf_dl(module_id_t module_id,
* allocation after CCE alloc fail would be more complex) */
int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+ const int alloc = nr_acknack_scheduling(module_id, iterator->UE, frame, slot, r_pucch, 0);
if (alloc<0) {
LOG_D(NR_MAC,
- "could not find PUCCH for UE %d/%04x@%d.%d\n",
- UE_id,
+ "could not find PUCCH for %04x@%d.%d\n",
rnti,
frame,
slot);
mac->pdcch_cand[cid]--;
+ iterator++;
continue;
}
- /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE
- * and PUCCH */
- max_num_ue--;
- AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue);
sched_ctrl->cce_index = CCEIndex;
fill_pdcch_vrb_map(mac,
/* CC_id = */ 0,
&sched_ctrl->sched_pdcch,
CCEIndex,
sched_ctrl->aggregation_level);
- /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
- max_num_ue--;
-
- if (max_num_ue < 0) return;
/* MCS has been set above */
- const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot];
+ const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n");
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
- if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda) {
+ if (ps->nrOfLayers != iterator->UE->layers || ps->time_domain_allocation != tda ) {
nr_set_pdsch_semi_static(sib1,
scc,
- UE_info->CellGroup[UE_id],
+ iterator->UE->CellGroup,
sched_ctrl->active_bwp,
bwpd,
tda,
- layers[UE_id],
+ iterator->UE->layers,
sched_ctrl,
ps);
}
@@ -969,27 +802,25 @@ void pf_dl(module_id_t module_id,
for (int rb = 0; rb < sched_pdsch->rbSize; rb++)
rballoc_mask[rb + sched_pdsch->rbStart] ^= slbitmap;
+
+ remainUEs--;
+ iterator++;
}
}
void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) {
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
- if (UE_info->num_UEs == 0)
+ if (UE_info->list[0] == NULL)
return;
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
const int CC_id = 0;
/* Get bwpSize and TDAfrom the first UE */
/* This is temporary and it assumes all UEs have the same BWP and TDA*/
- int UE_id = UE_info->list.head;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
-
- if (!RC.nrmac[module_id]->preferred_dl_tda[bwp_id])
- return;
-
- const int tda = RC.nrmac[module_id]->preferred_dl_tda[bwp_id][slot];
+ NR_UE_info_t *UE=UE_info->list[0];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
int startSymbolIndex, nrOfSymbols;
const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_bwp ?
sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList :
@@ -998,17 +829,16 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
-
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
sib1);
NR_BWP_DownlinkDedicated_t *bwpd =
- UE_info->CellGroup[UE_id] &&
- UE_info->CellGroup[UE_id]->spCellConfig &&
- UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated ?
- UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
+ UE->CellGroup &&
+ UE->CellGroup->spCellConfig &&
+ UE->CellGroup->spCellConfig->spCellConfigDedicated ?
+ UE->CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
@@ -1026,9 +856,9 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
rballoc_mask[i] = (~vrb_map[i+BWPStart])&0x3fff; //bitwise not and 14 symbols
// if all the pdsch symbols are free
- if((rballoc_mask[i]&slbitmap) ==
- slbitmap)
+ if ((rballoc_mask[i]&slbitmap) == slbitmap) {
n_rb_sched++;
+ }
}
/* Retrieve amount of data to send for this UE */
@@ -1037,7 +867,7 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
pf_dl(module_id,
frame,
slot,
- &UE_info->list,
+ UE_info->list,
MAX_MOBILES_PER_GNB,
n_rb_sched,
rballoc_mask);
@@ -1084,18 +914,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
gNB_mac->pre_processor_dl(module_id, frame, slot);
const int CC_id = 0;
NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &gNB_mac->UE_info;
+ NR_UEs_t *UE_info = &gNB_mac->UE_info;
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
- NR_list_t *UE_list = &UE_info->list;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(UE_info->list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue;
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
- UE_info->mac_stats[UE_id].dlsch_current_bytes = 0;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ UE->mac_stats.dl.current_bytes = 0;
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_BWP_DownlinkDedicated_t *bwpd =
cg &&
@@ -1109,13 +938,13 @@ void nr_schedule_ue_spec(module_id_t module_id,
* If we add the CE, ta_apply will be reset */
if (frame == (sched_ctrl->ta_frame + 10) % 1024) {
sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */
- LOG_D(NR_MAC, "[UE %d][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE_id, frame, slot);
+ LOG_D(NR_MAC, "[UE %04x][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE->rnti, frame, slot);
}
if (sched_pdsch->rbSize <= 0)
continue;
- const rnti_t rnti = UE_info->rnti[UE_id];
+ const rnti_t rnti = UE->rnti;
/* pre-computed PDSCH values that only change if time domain
* allocation/DMRS parameters change. Updated in the preprocessor through
* nr_set_pdsch_semi_static() */
@@ -1131,8 +960,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
/* PP has not selected a specific HARQ Process, get a new one */
current_harq_pid = sched_ctrl->available_dl_harq.head;
AssertFatal(current_harq_pid >= 0,
- "no free HARQ process available for UE %d\n",
- UE_id);
+ "no free HARQ process available for UE %04x\n",
+ UE->rnti);
remove_front_nr_list(&sched_ctrl->available_dl_harq);
sched_pdsch->dl_harq_pid = current_harq_pid;
} else {
@@ -1152,12 +981,11 @@ void nr_schedule_ue_spec(module_id_t module_id,
harq->feedback_frame = pucch->frame;
harq->feedback_slot = pucch->ul_slot;
harq->is_waiting = true;
- UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
+ UE->mac_stats.dl.rounds[harq->round]++;
LOG_D(NR_MAC,
- "%4d.%2d [DLSCH/PDSCH/PUCCH] UE %d RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n",
+ "%4d.%2d [DLSCH/PDSCH/PUCCH] RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n",
frame,
slot,
- UE_id,
rnti,
sched_ctrl->aggregation_level,
sched_pdsch->rbStart,
@@ -1186,7 +1014,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space : gNB_mac->sched_ctrlCommon->search_space;
- const int bwpid = bwp ? bwp->bwp_Id : 0;
+ const int bwp_id = bwp ? bwp->bwp_Id : 0;
const int coresetid = (bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : gNB_mac->sched_ctrlCommon->coreset->controlResourceSetId;
/* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it */
@@ -1200,7 +1028,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
dl_req->nPDUs += 1;
pdcch_pdu = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
- LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %d, bwp %d, cs %d\n",UE_id,bwpid,coresetid);
+ LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %04x, bwp %d, cs %d\n", UE->rnti, bwp_id, coresetid);
NR_ControlResourceSet_t *coreset = (bwp||bwpd)? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
nr_configure_pdcch(pdcch_pdu, coreset, genericParameters, &sched_ctrl->sched_pdcch);
gNB_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu;
@@ -1232,6 +1060,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdsch_pdu->CyclicPrefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0;
// Codeword information
pdsch_pdu->NrOfCodewords = 1;
+ //number of information bits per 1024 coded bits expressed in 0.1 bit units
pdsch_pdu->targetCodeRate[0] = R;
pdsch_pdu->qamModOrder[0] = Qm;
pdsch_pdu->mcsIndex[0] = sched_pdsch->mcs;
@@ -1259,7 +1088,18 @@ void nr_schedule_ue_spec(module_id_t module_id,
// Resource Allocation in time domain
pdsch_pdu->StartSymbolIndex = ps->startSymbolIndex;
pdsch_pdu->NrOfSymbols = ps->nrOfSymbols;
-
+ // Precoding
+ if (sched_ctrl->set_pmi) {
+ const int report_id = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id;
+ nr_csi_report_t *csi_report = &UE->csi_report_template[report_id];
+ pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize;
+ pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = set_pm_index(sched_ctrl,
+ nrOfLayers,
+ csi_report->N1,
+ csi_report->N2,
+ gNB_mac->xp_pdsch_antenna_ports,
+ csi_report->codebook_mode);
+ }
// TBS_LBRM according to section 5.4.2.1 of 38.212
long *maxMIMO_Layers = cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers;
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
@@ -1324,18 +1164,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t));
// bwp indicator
const int n_dl_bwp = bwp ? cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count : 0;
- AssertFatal(n_dl_bwp <= 1, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp);
+ AssertFatal(n_dl_bwp <= NR_MAX_NUM_BWP, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp);
+
// as per table 7.3.1.1.2-1 in 38.212
dci_payload.bwp_indicator.val = bwp ? (n_dl_bwp < 4 ? bwp->bwp_Id : bwp->bwp_Id - 1) : 0;
if (bwp) AssertFatal(bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1,
"Only frequency resource allocation type 1 is currently supported\n");
- dci_payload.frequency_domain_assignment.val =
- PRBalloc_to_locationandbandwidth0(
- pdsch_pdu->rbSize,
- pdsch_pdu->rbStart,
- pdsch_pdu->BWPSize);
+ dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu->rbSize,
+ pdsch_pdu->rbStart,
+ pdsch_pdu->BWPSize);
dci_payload.format_indicator = 1;
dci_payload.time_domain_assignment.val = ps->time_domain_allocation;
dci_payload.mcs = sched_pdsch->mcs;
@@ -1350,13 +1189,14 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
LOG_D(NR_MAC,
"%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
- "time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n",
+ "nrOfLayers %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n",
frame,
slot,
dci_payload.frequency_domain_assignment.val,
pdsch_pdu->rbStart,
pdsch_pdu->rbSize,
pdsch_pdu->BWPSize,
+ pdsch_pdu->nrOfLayers,
dci_payload.time_domain_assignment.val,
dci_payload.vrb_to_prb_mapping.val,
dci_payload.mcs,
@@ -1366,7 +1206,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_payload.tpc,
pucch->timing_indicator);
-
int dci_format = ss && ss->searchSpaceType && ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific ?
NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0;
@@ -1378,7 +1217,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_format,
rnti_type,
pdsch_pdu->BWPSize,
- bwp? bwp->bwp_Id : 0,
+ bwp ? bwp->bwp_Id : 0,
+ coresetid,
gNB_mac->cset0_bwp_size);
LOG_D(NR_MAC,
@@ -1392,17 +1232,16 @@ void nr_schedule_ue_spec(module_id_t module_id,
* from RLC or encode MAC CEs. The TX_req structure is filled below
* or copy data to FAPI structures */
LOG_D(NR_MAC,
- "%d.%2d DL retransmission UE %d/RNTI %04x HARQ PID %d round %d NDI %d\n",
+ "%d.%2d DL retransmission RNTI %04x HARQ PID %d round %d NDI %d\n",
frame,
slot,
- UE_id,
rnti,
current_harq_pid,
harq->round,
harq->ndi);
AssertFatal(harq->sched_pdsch.tb_size == TBS,
- "UE %d mismatch between scheduled TBS and buffered TB for HARQ PID %d\n",
- UE_id,
+ "UE %04x mismatch between scheduled TBS and buffered TB for HARQ PID %d\n",
+ UE->rnti,
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->transportBlock, TBS));
@@ -1439,7 +1278,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
/* limit requested number of bytes to what preprocessor specified, or
* such that TBS is full */
const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer,
- bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
+ bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
tbs_size_t len = mac_rlc_data_req(module_id,
rnti,
module_id,
@@ -1474,7 +1313,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
lcid_bytes += len;
}
- UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += lcid_bytes;
+ UE->mac_stats.dl.lc_bytes[lcid] += lcid_bytes;
}
} else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) {
/* we will need the large header, phy-test typically allocates all
@@ -1512,8 +1351,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
buf=bufEnd;
}
- UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS;
- UE_info->mac_stats[UE_id].dlsch_current_bytes = TBS;
+ UE->mac_stats.dl.total_bytes += TBS;
+ UE->mac_stats.dl.current_bytes = TBS;
/* save retransmission information */
harq->sched_pdsch = *sched_pdsch;
/* save which time allocation has been used, to be used on
@@ -1525,10 +1364,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
sched_ctrl->ta_apply = false;
sched_ctrl->ta_frame = frame;
LOG_D(NR_MAC,
- "%d.%2d UE %d TA scheduled, resetting TA frame\n",
+ "%d.%2d UE %04x TA scheduled, resetting TA frame\n",
frame,
slot,
- UE_id);
+ UE->rnti);
}
T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 5f23a40106..56d14b1458 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -69,7 +69,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
nfapi_nr_pdu_t *TX_req;
uint16_t rnti = 0x1234;
-
// int time_domain_assignment,k0;
NR_ServingCellConfigCommon_t *scc=cc->ServingCellConfigCommon;
@@ -152,8 +151,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
NrOfSymbols = NrOfSymbols_tmp;
StartSymbolIndex = StartSymbolIndex_tmp;
mappingtype = mappingtype_tmp;
- // k0 = *scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0;
- // time_domain_assignment = i;
}
}
AssertFatal(StartSymbolIndex>=0,"StartSymbolIndex is negative\n");
@@ -163,80 +160,9 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
scc->dmrs_TypeA_Position,
NrOfSymbols,
StartSymbolIndex,
- mappingtype, 1);
+ mappingtype,
+ 1);
- /*
- AssertFatal(k0==0,"k0 is not zero for Initial DL BWP TimeDomain Alloc\n");
- nr_configure_css_dci_initial(pdcch_pdu_rel15,
- scs,
- scs,
- FR,
- 0,
- 0,
- 0,
- sfn_sf, slotP,
- slots_per_frame,
- dlBWP_carrier_bandwidth);
-
-
- pdu_rel15->frequency_domain_assignment = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize,
- pdsch_pdu_rel15->rbStart,
- dlBWP_carrier_bandwidth);
- pdu_rel15->time_domain_assignment = time_domain_assignment;
-
- pdu_rel15->vrb_to_prb_mapping = 1;
- pdu_rel15->mcs = 9;
- pdu_rel15->tb_scaling = 1;
-
- pdu_rel15->ra_preamble_index = 25;
- pdu_rel15->format_indicator = 1;
- pdu_rel15->ndi = 1;
- pdu_rel15->rv = 0;
- pdu_rel15->harq_pid = 0;
- pdu_rel15->dai = 2;
- pdu_rel15->tpc = 2;
- pdu_rel15->pucch_resource_indicator = 7;
- pdu_rel15->pdsch_to_harq_feedback_timing_indicator = 7;
-
- LOG_D(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n",
- pdu_rel15->frequency_domain_assignment,
- pdu_rel15->time_domain_assignment,
- pdu_rel15->vrb_to_prb_mapping,
- pdu_rel15->mcs,
- pdu_rel15->tb_scaling,
- pdu_rel15->ndi,
- pdu_rel15->rv);
-
- params_rel15->rnti = rnti;
- params_rel15->rnti_type = NFAPI_NR_RNTI_C;
- params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0;
- //params_rel15->aggregation_level = 1;
- LOG_D(MAC, "DCI type 1 params: rnti %x, rnti_type %d, dci_format %d\n \
- coreset params: mux_pattern %d, n_rb %d, n_symb %d, rb_offset %d \n \
- ss params : nb_ss_sets_per_slot %d, first symb %d, nb_slots %d, sfn_mod2 %d, first slot %d\n",
- params_rel15->rnti,
- params_rel15->rnti_type,
- params_rel15->dci_format,
- params_rel15->mux_pattern,
- params_rel15->n_rb,
- params_rel15->n_symb,
- params_rel15->rb_offset,
- params_rel15->nb_ss_sets_per_slot,
- params_rel15->first_symbol,
- params_rel15->nb_slots,
- params_rel15->sfn_mod2,
- params_rel15->first_slot);
- nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, dl_tti_dci_pdu->dci_dl_pdu,0);
- LOG_D(MAC, "DLSCH PDU: start PRB %d n_PRB %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d\n",
- pdsch_pdu_rel15->rbStart,
- pdsch_pdu_rel15->rbSize,
- pdsch_pdu_rel15->StartSymbolIndex,
- pdsch_pdu_rel15->NrOfSymbols,
- pdsch_pdu_rel15->nrOfLayers,
- pdsch_pdu_rel15->NrOfCodewords,
- pdsch_pdu_rel15->mcsIndex[0]);
- */
-
nr_mac->DL_req[CC_id].dl_tti_request_body.nPDUs+=2;
TX_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
@@ -266,24 +192,21 @@ void nr_preprocessor_phytest(module_id_t module_id,
{
if (!is_xlsch_in_slot(dlsch_slot_bitmap, slot))
return;
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ NR_UE_info_t *UE = RC.nrmac[module_id]->UE_info.list[0];
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
- const int UE_id = 0;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
const int CC_id = 0;
- AssertFatal(UE_info->active[UE_id],
- "%s(): expected UE %d to be active\n",
- __func__,
- UE_id);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
+
+ const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
ps->nrOfLayers = target_dl_Nl;
if (ps->time_domain_allocation != tda || ps->nrOfLayers != target_dl_Nl)
- nr_set_pdsch_semi_static(NULL, scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, NULL, tda, target_dl_Nl, sched_ctrl, ps);
+ nr_set_pdsch_semi_static(NULL, scc, UE->CellGroup, sched_ctrl->active_bwp, NULL, tda, target_dl_Nl,sched_ctrl , ps);
/* find largest unallocated chunk */
const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
int rbStart = 0;
int rbSize = 0;
if (target_dl_bw>bwpSize)
@@ -314,7 +237,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
sched_ctrl->dl_lc_num = 1;
const int lcid = DL_SCH_LCID_DTCH;
sched_ctrl->dl_lc_ids[sched_ctrl->dl_lc_num - 1] = lcid;
- const uint16_t rnti = UE_info->rnti[UE_id];
+ const uint16_t rnti = UE->rnti;
/* update sched_ctrl->num_total_bytes so that postprocessor schedules data,
* if available */
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
@@ -341,7 +264,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n");
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, UE->rnti);
int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
CC_id,
@@ -352,17 +275,16 @@ void nr_preprocessor_phytest(module_id_t module_id,
Y);
AssertFatal(CCEIndex >= 0,
- "%s(): could not find CCE for UE %d\n",
+ "%s(): could not find CCE for UE %04x\n",
__func__,
- UE_id);
+ UE->rnti);
int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, NULL, CCEIndex);
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+ const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0);
if (alloc < 0) {
LOG_D(MAC,
- "%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
+ "%s(): could not find PUCCH for UE %04x@%d.%d\n",
__func__,
- UE_id,
rnti,
frame,
slot);
@@ -412,6 +334,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
uint32_t target_ul_mcs = 9;
uint32_t target_ul_bw = 50;
+uint32_t target_ul_Nl = 1;
uint64_t ulsch_slot_bitmap = (1 << 8);
bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_t slot)
{
@@ -419,32 +342,36 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
NR_COMMON_channels_t *cc = nr_mac->common_channels;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
+ NR_UE_info_t *UE = nr_mac->UE_info.list[0];
- AssertFatal(UE_info->num_UEs <= 1,
- "%s() cannot handle more than one UE, but found %d\n",
- __func__,
- UE_info->num_UEs);
- if (UE_info->num_UEs == 0)
+ AssertFatal(nr_mac->UE_info.list[1] == NULL,
+ "cannot handle more than one UE\n");
+ if (UE == NULL)
return false;
- const int UE_id = 0;
const int CC_id = 0;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
- const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 1;
- if (tda < 0)
- return false;
const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList =
sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ const int temp_tda = get_ul_tda(nr_mac, scc, slot);
+ if (temp_tda < 0)
+ return false;
+ AssertFatal(temp_tda < tdaList->list.count,
+ "time domain assignment %d >= %d\n",
+ temp_tda,
+ tdaList->list.count);
+ int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, temp_tda, mu);
+ const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
+ const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+ const int tda = get_ul_tda(nr_mac, scc, sched_slot);
+ if (tda < 0)
+ return false;
AssertFatal(tda < tdaList->list.count,
"time domain assignment %d >= %d\n",
tda,
tdaList->list.count);
- int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, tda, mu);
- const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
- const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
/* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE
* limitations). Note that if K2 or the TDD configuration is changed, below
* conditions might exclude each other and never be true */
@@ -455,15 +382,19 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) ?
sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
const int dci_format = f ? NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0;
- const uint8_t num_dmrs_cdm_grps_no_data = 1;
+ uint8_t num_dmrs_cdm_grps_no_data = 1;
+ if ((target_ul_Nl==4)||(target_ul_Nl==3))
+ num_dmrs_cdm_grps_no_data = 2;
+
/* we want to avoid a lengthy deduction of DMRS and other parameters in
* every TTI if we can save it, so check whether dci_format, TDA, or
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
+ || ps->nrOfLayers != target_ul_Nl
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
- nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data,target_ul_Nl,ps);
uint16_t rbStart = 0;
uint16_t rbSize;
@@ -509,7 +440,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n");
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, UE->rnti);
int CCEIndex = find_pdcch_candidate(nr_mac,
CC_id,
@@ -536,6 +467,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head;
/* Calculate TBS from MCS */
+ ps->nrOfLayers = target_ul_Nl;
sched_pusch->R = nr_get_code_rate_ul(mcs, ps->mcs_table);
sched_pusch->Qm = nr_get_Qm_ul(mcs, ps->mcs_table);
if (ps->pusch_Config->tp_pi2BPSK
@@ -550,7 +482,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
ps->N_PRB_DMRS * ps->num_dmrs_symb,
0, // nb_rb_oh
0,
- 1 /* NrOfLayers */)
+ ps->nrOfLayers /* NrOfLayers */)
>> 3;
/* mark the corresponding RBs as used */
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 3f7a908395..295d81bcd6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -113,18 +113,18 @@ uint8_t nr_ss_first_symb_idx_scs_120_120_mux3[4] = {4,8,2,6};
uint8_t nr_max_number_of_candidates_per_slot[4] = {44, 36, 22, 20};
uint8_t nr_max_number_of_cces_per_slot[4] = {56, 56, 48, 32};
-// CQI TABLES
+// CQI TABLES (10 times the value in 214 to adequately compare with R)
// Table 1 (38.214 5.2.2.1-2)
-uint16_t cqi_table1[16][2] = {{0,0},{2,78},{2,120},{2,193},{2,308},{2,449},{2,602},{4,378},
- {4,490},{4,616},{6,466},{6,567},{6,666},{6,772},{6,873},{6,948}};
+uint16_t cqi_table1[16][2] = {{0,0},{2,780},{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780},
+ {4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720},{6,8730},{6,9480}};
// Table 2 (38.214 5.2.2.1-3)
-uint16_t cqi_table2[16][2] = {{0,0},{2,78},{2,193},{2,449},{4,378},{4,490},{4,616},{6,466},
- {6,567},{6,666},{6,772},{6,873},{8,711},{8,797},{8,885},{8,948}};
+uint16_t cqi_table2[16][2] = {{0,0},{2,780},{2,1930},{2,4490},{4,3780},{4,4900},{4,6160},{6,4660},
+ {6,5670},{6,6660},{6,7720},{6,8730},{8,7110},{8,7970},{8,8850},{8,9480}};
// Table 2 (38.214 5.2.2.1-4)
-uint16_t cqi_table3[16][2] = {{0,0},{2,30},{2,50},{2,78},{2,120},{2,193},{2,308},{2,449},
- {2,602},{4,378},{4,490},{4,616},{6,466},{6,567},{6,666},{6,772}};
+uint16_t cqi_table3[16][2] = {{0,0},{2,300},{2,500},{2,780},{2,1200},{2,1930},{2,3080},{2,4490},
+ {2,6020},{4,3780},{4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720}};
static inline uint8_t get_max_candidates(uint8_t scs) {
@@ -145,50 +145,68 @@ uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl) {
}
-void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
- NR_UE_sched_ctrl_t *sched_ctrl,
- uint8_t *target_mcs,
- uint8_t mcs_table_idx) {
+uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
+ int layers,
+ int N1, int N2,
+ int xp_pdsch_antenna_ports,
+ int codebook_mode) {
- if (sched_ctrl->set_mcs) {
- // TODO for wideband case and multiple TB
- int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
- uint16_t target_coderate,target_qm;
- if (cqi_idx>0) {
- int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
- if (cqi_table != mcs_table_idx)
- LOG_W(NR_MAC,"Indices of MCS tables don't correspond yet, cri_ri_li_pmi_cqi_report.cqi_table %d, mcs_table_index %d\n",cqi_table,mcs_table_idx);
- switch (cqi_table) {
- case 0:
- target_qm = cqi_table1[cqi_idx][0];
- target_coderate = cqi_table1[cqi_idx][1];
- break;
- case 1:
- target_qm = cqi_table2[cqi_idx][0];
- target_coderate = cqi_table2[cqi_idx][1];
- break;
- case 2:
- target_qm = cqi_table3[cqi_idx][0];
- target_coderate = cqi_table3[cqi_idx][1];
- break;
- default:
- AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
- }
- int max_mcs = 28;
- int R,Qm;
- if (mcs_table_idx == 1)
- max_mcs = 27;
- for (int i=0; i<=max_mcs; i++) {
- R = nr_get_code_rate_dl(i, mcs_table_idx);
- Qm = nr_get_Qm_dl(i, mcs_table_idx);
- if ((Qm == target_qm) && (target_coderate <= R)) {
- *target_mcs = i;
- break;
- }
- }
- }
- sched_ctrl->set_mcs = FALSE;
+ int antenna_ports = (N1*N2)<<1;
+ if (xp_pdsch_antenna_ports == 1 &&
+ antenna_ports>1)
+ return 0; //identity matrix (basic 5G configuration handled by PMI report is with XP antennas)
+
+ int x1 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1;
+ int x2 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2;
+ LOG_D(NR_MAC,"PMI report: x1 %d x2 %d\n",x1,x2);
+
+ sched_ctrl->set_pmi = false;
+
+ if (antenna_ports == 2)
+ return x2;
+ else
+ AssertFatal(1==0,"More than 2 antenna ports not yet supported\n");
+}
+
+uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx)
+{
+ if (cqi_idx <= 0) {
+ LOG_E(NR_MAC, "invalid cqi_idx %d, default to MCS 9\n", cqi_idx);
+ return 9;
}
+
+ if (mcs_table != cqi_table) {
+ LOG_E(NR_MAC, "indices of CQI (%d) and MCS (%d) tables don't correspond yet\n", cqi_table, mcs_table);
+ return 9;
+ }
+
+ uint16_t target_coderate, target_qm;
+ switch (cqi_table) {
+ case 0:
+ target_qm = cqi_table1[cqi_idx][0];
+ target_coderate = cqi_table1[cqi_idx][1];
+ break;
+ case 1:
+ target_qm = cqi_table2[cqi_idx][0];
+ target_coderate = cqi_table2[cqi_idx][1];
+ break;
+ case 2:
+ target_qm = cqi_table3[cqi_idx][0];
+ target_coderate = cqi_table3[cqi_idx][1];
+ break;
+ default:
+ AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
+ }
+ const int max_mcs = mcs_table == 1 ? 27 : 28;
+ for (int i = 0; i <= max_mcs; i++) {
+ const int R = nr_get_code_rate_dl(i, mcs_table);
+ const int Qm = nr_get_Qm_dl(i, mcs_table);
+ if (Qm == target_qm && target_coderate <= R)
+ return i;
+ }
+
+ LOG_E(NR_MAC, "could not find maximum MCS from cqi_idx %d, default to 9\n", cqi_idx);
+ return 9;
}
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
@@ -270,7 +288,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(
}
-NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
+NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac,
NR_ServingCellConfigCommon_t *scc,
void *bwp,
NR_SearchSpace_t *ss,
@@ -280,7 +298,7 @@ NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
if (ss_type == NR_SearchSpace__searchSpaceType_PR_common) { // common search space
NR_ControlResourceSet_t *coreset;
if(coreset_id == 0) {
- coreset = RC.nrmac[module_idP]->sched_ctrlCommon->coreset; // this is coreset 0
+ coreset = nrmac->sched_ctrlCommon->coreset; // this is coreset 0
} else if (bwp) {
coreset = ((NR_BWP_Downlink_t*)bwp)->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
} else if (scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet) {
@@ -511,7 +529,6 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
}
}
-
bool nr_find_nb_rb(uint16_t Qm,
uint16_t R,
uint8_t nrOfLayers,
@@ -572,8 +589,7 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
{
bool reset_dmrs = false;
- NR_BWP_DownlinkDedicated_t *bwpd;
-
+ NR_BWP_DownlinkDedicated_t *bwpd = NULL;
if (bwp && bwp->bwp_Dedicated) {
bwpd = bwp->bwp_Dedicated;
} else {
@@ -600,26 +616,24 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
}
LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx);
- NR_PDSCH_Config_t *pdsch_Config=NULL;
- if (bwpd) pdsch_Config = bwpd->pdsch_Config->choice.setup;
+ NR_PDSCH_Config_t *pdsch_Config = NULL;
+ if (bwpd && bwpd->pdsch_Config) pdsch_Config = bwpd->pdsch_Config->choice.setup;
LOG_D(NR_MAC,"tda %d, ps->time_domain_allocation %d,layers %d, ps->nrOfLayers %d, pdsch_config %p\n",tda,ps->time_domain_allocation,layers,ps->nrOfLayers,pdsch_Config);
- if (ps->time_domain_allocation != tda) {
- reset_dmrs = true;
- ps->time_domain_allocation = tda;
- NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1);
- AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
- ps->mapping_type = tdaList->list.array[tda]->mappingType;
- if (pdsch_Config) {
- if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB)
- ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type == NULL ? 0 : 1;
- else
- ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1;
- }
+ reset_dmrs = true;
+ ps->time_domain_allocation = tda;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1);
+ AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
+ ps->mapping_type = tdaList->list.array[tda]->mappingType;
+ if (pdsch_Config) {
+ if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB)
+ ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type != NULL;
else
- ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
- const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
- SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols);
+ ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type != NULL;
}
+ else
+ ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
+ const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
+ SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols);
const long f = ((bwp || bwpd) &&
sched_ctrl->search_space &&
@@ -643,8 +657,8 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
ps->nrOfLayers = 1;
}
else {
- if (ps->nrOfLayers != layers ||
- ps->numDmrsCdmGrpsNoData == 0) {
+ LOG_D(NR_MAC,"checking layers\n");
+ if (ps->nrOfLayers != layers || ps->numDmrsCdmGrpsNoData == 0) {
reset_dmrs = true;
ps->nrOfLayers = layers;
set_dl_dmrs_ports(ps);
@@ -667,7 +681,9 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
long dci_format,
int tda,
uint8_t num_dmrs_cdm_grps_no_data,
+ uint8_t nrOfLayers,
NR_pusch_semi_static_t *ps) {
+
ps->dci_format = dci_format;
ps->time_domain_allocation = tda;
@@ -709,6 +725,7 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
num_dmrs_cdm_grps_no_data = 2; // in case of transform precoding - no Data sent in DMRS symbol
}
+ ps->nrOfLayers = nrOfLayers;
ps->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
/* DMRS calculations */
@@ -742,6 +759,51 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
: num_dmrs_cdm_grps_no_data * 4;
}
+#define BLER_UPDATE_FRAME 10
+#define BLER_FILTER 0.9f
+int get_mcs_from_bler(const NR_bler_options_t *bler_options,
+ const NR_mac_dir_stats_t *stats,
+ NR_bler_stats_t *bler_stats,
+ int max_mcs,
+ frame_t frame)
+{
+ /* first call: everything is zero. Initialize to sensible default */
+ if (bler_stats->last_frame == 0 && bler_stats->mcs == 0) {
+ bler_stats->last_frame = frame;
+ bler_stats->mcs = 9;
+ bler_stats->bler = (bler_options->lower + bler_options->upper) / 2.0f;
+ }
+ int diff = frame - bler_stats->last_frame;
+ if (diff < 0) // wrap around
+ diff += 1024;
+
+ max_mcs = min(max_mcs, bler_options->max_mcs);
+ const uint8_t old_mcs = min(bler_stats->mcs, max_mcs);
+ if (diff < BLER_UPDATE_FRAME)
+ return old_mcs; // no update
+
+ // last update is longer than x frames ago
+ const int dtx = (int)(stats->rounds[0] - bler_stats->rounds[0]);
+ const int dretx = (int)(stats->rounds[1] - bler_stats->rounds[1]);
+ const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler;
+ bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window;
+
+ int new_mcs = old_mcs;
+ if (bler_stats->bler < bler_options->lower && old_mcs < max_mcs && dtx > 9)
+ new_mcs += 1;
+ else if ((bler_stats->bler > bler_options->upper && old_mcs > 6) // above threshold
+ || (dtx <= 3 && old_mcs > 9)) // no activity
+ new_mcs -= 1;
+ // else we are within threshold boundaries
+
+ bler_stats->last_frame = frame;
+ bler_stats->mcs = new_mcs;
+ memcpy(bler_stats->rounds, stats->rounds, sizeof(stats->rounds));
+ LOG_D(MAC, "frame %4d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f)\n",
+ frame, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler);
+ return new_mcs;
+}
+
void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
nr_scs_e scs_common,
nr_scs_e pdcch_scs,
@@ -1009,8 +1071,16 @@ void config_uldci(const NR_SIB1_t *sib1,
"Non Codebook configuration non supported\n");
dci_pdu_rel15->srs_resource_indicator.val = 0; // taking resource 0 for SRS
}
+ dci_pdu_rel15->precoding_information.val= 0;
+ if (pusch_pdu->nrOfLayers == 2)
+ dci_pdu_rel15->precoding_information.val = 4;
+ else if (pusch_pdu->nrOfLayers == 4)
+ dci_pdu_rel15->precoding_information.val = 11;
+
+ // antenna_ports.val = 0 for transform precoder is disabled, dmrs-Type=1, maxLength=1, Rank=1/2/3/4
// Antenna Ports
- dci_pdu_rel15->antenna_ports.val = 0; // TODO for now it is hardcoded, it should depends on cdm group no data and rank
+ dci_pdu_rel15->antenna_ports.val = 0;
+
// DMRS sequence initialization
dci_pdu_rel15->dmrs_sequence_initialization.val = pusch_pdu->scid;
break;
@@ -1019,11 +1089,14 @@ void config_uldci(const NR_SIB1_t *sib1,
}
LOG_D(NR_MAC,
- "%s() ULDCI type 0 payload: freq_alloc %d, time_alloc %d, freq_hop_flag %d, mcs %d tpc %d ndi %d rv %d\n",
+ "%s() ULDCI type 0 payload: dci_format %d, freq_alloc %d, time_alloc %d, freq_hop_flag %d, precoding_information.val %d antenna_ports.val %d mcs %d tpc %d ndi %d rv %d\n",
__func__,
+ dci_format,
dci_pdu_rel15->frequency_domain_assignment.val,
dci_pdu_rel15->time_domain_assignment.val,
dci_pdu_rel15->frequency_hopping_flag.val,
+ dci_pdu_rel15->precoding_information.val,
+ dci_pdu_rel15->antenna_ports.val,
dci_pdu_rel15->mcs,
dci_pdu_rel15->tpc,
dci_pdu_rel15->ndi,
@@ -1043,8 +1116,6 @@ int nr_get_default_pucch_res(int pucch_ResourceCommon) {
return(default_pucch_csset[pucch_ResourceCommon]);
}
-
-
void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
NR_ControlResourceSet_t *coreset,
NR_BWP_t *bwp,
@@ -1486,12 +1557,13 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
int rnti_type,
int N_RB,
int bwp_id,
+ NR_ControlResourceSetId_t coreset_id,
uint16_t cset0_bwp_size) {
uint8_t fsize = 0, pos = 0;
uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
*dci_pdu=0;
- int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, cset0_bwp_size);
+ int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size);
pdcch_dci_pdu->PayloadSizeBits = dci_size;
AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
@@ -2059,10 +2131,11 @@ int extract_length(int startSymbolAndLength) {
/*
* Dump the UL or DL UE_info into LOG_T(MAC)
*/
-void dump_nr_list(NR_list_t *listP)
+void dump_nr_list(NR_UE_info_t **list)
{
- for (int j = listP->head; j >= 0; j = listP->next[j])
- LOG_T(NR_MAC, "NR list node %d => %d\n", j, listP->next[j]);
+ UE_iterator(list, UE) {
+ LOG_T(NR_MAC, "NR list UEs rntis %04x\n", (*list)->rnti);
+ }
}
/*
@@ -2146,16 +2219,7 @@ void remove_nr_list(NR_list_t *listP, int id)
prev = cur;
cur = &listP->next[*cur];
}
- if (*cur == -1) {
- cur = &listP->head;
- prev=&listP->head;
- while (*cur != -1 && *cur != id) {
- LOG_I(NR_MAC,"remove_nr_list : id %d, *cur %d\n",id,*cur);
- prev = cur;
- cur = &listP->next[*cur];
- }
- AssertFatal(1==0, "ID %d not found in UE_list\n", id);
- }
+ AssertFatal(*cur != -1, "ID %d not found in UE_list\n", id);
int *next = &listP->next[*cur];
*cur = listP->next[*cur];
*next = -1;
@@ -2200,21 +2264,16 @@ void remove_front_nr_list(NR_list_t *listP)
listP->tail = -1;
}
-int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP)
-//------------------------------------------------------------------------------
+NR_UE_info_t *find_nr_UE(NR_UEs_t *UEs, rnti_t rntiP)
{
- int UE_id;
- NR_UE_info_t *UE_info = &RC.nrmac[mod_idP]->UE_info;
-
- for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) {
- if (UE_info->active[UE_id]) {
- if (UE_info->rnti[UE_id] == rntiP) {
- return UE_id;
- }
+ UE_iterator(UEs->list, UE) {
+ if (UE->rnti == rntiP) {
+ LOG_D(NR_MAC,"Search and found rnti: %04x\n", rntiP);
+ return UE;
}
}
-
- return -1;
+ LOG_W(NR_MAC,"Search for not existing rnti: %04x\n", rntiP);
+ return NULL;
}
uint16_t get_Y(int cid, int slot, rnti_t rnti) {
@@ -2287,42 +2346,86 @@ int get_ul_bwp_id(const NR_ServingCellConfig_t *servingCellConfig)
return 1;
}
-//------------------------------------------------------------------------------
-int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup)
-{
- gNB_MAC_INST *nr_mac = RC.nrmac[mod_idP];
- NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
- LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti 0x%04x (num_UEs %d)\n",
- mod_idP,
- rntiP,
- UE_info->num_UEs);
- dump_nr_list(&UE_info->list);
+/* hack data to remove UE in the phy */
+int rnti_to_remove[10];
+volatile int rnti_to_remove_count;
+pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER;
- for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
- if (UE_info->active[i]) {
- LOG_D(NR_MAC,"UE %x is active, skipping\n",rntiP);
- continue;
+void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr)
+{
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ destroy_nr_list(&sched_ctrl->available_dl_harq);
+ destroy_nr_list(&sched_ctrl->feedback_dl_harq);
+ destroy_nr_list(&sched_ctrl->retrans_dl_harq);
+ 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, "Remove NR rnti 0x%04x\n", UE->rnti);
+ const rnti_t rnti = UE->rnti;
+ free(UE);
+ /* hack to remove UE in the phy */
+ if (pthread_mutex_lock(&rnti_to_remove_mutex))
+ exit(1);
+ if (rnti_to_remove_count == 10)
+ exit(1);
+ rnti_to_remove[rnti_to_remove_count] = rnti;
+ LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti);
+ rnti_to_remove_count++;
+ if (pthread_mutex_unlock(&rnti_to_remove_mutex))
+ exit(1);
+
+ /* clear RA process(es?) associated to the UE */
+ for (int cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) {
+ for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+ NR_COMMON_channels_t *cc = &ccPtr[cc_id];
+ if (cc->ra[i].rnti == rnti) {
+ LOG_D(NR_MAC, "free RA process %d for rnti %04x\n", i, rnti);
+ /* is it enough? */
+ cc->ra[i].cfra = false;
+ cc->ra[i].rnti = 0;
+ cc->ra[i].crnti = 0;
+ }
}
- int UE_id = i;
- UE_info->num_UEs++;
- UE_info->active[UE_id] = true;
- if (CellGroup) UE_info->Msg4_ACKed[UE_id] = true;
- else UE_info->Msg4_ACKed[UE_id] = false;
- UE_info->rnti[UE_id] = rntiP;
- UE_info->CellGroup[UE_id] = CellGroup;
- add_nr_list(&UE_info->list, UE_id);
- memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
- if (CellGroup &&
- CellGroup->spCellConfig &&
- CellGroup->spCellConfig->spCellConfigDedicated &&
- CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
- CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup
- )
- compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ }
+}
+
+//------------------------------------------------------------------------------
+NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup)
+{
+ NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
+ NR_UEs_t *UE_info = &nr_mac->UE_info;
+ LOG_I(NR_MAC, "Adding UE with rnti 0x%04x\n",
+ rntiP);
+ dump_nr_list(UE_info->list);
+
+ // We will attach at the end, to mitigate race conditions
+ // This is not good, but we will fix it progressively
+ NR_UE_info_t *UE=calloc(1,sizeof(NR_UE_info_t));
+ if(!UE) {
+ LOG_E(NR_MAC,"want to add UE %04x but the fixed allocated size is full\n",rntiP);
+ return NULL;
+ }
+
+ UE->rnti = rntiP;
+ UE->CellGroup = CellGroup;
+
+ if (CellGroup)
+ UE->Msg4_ACKed = true;
+ else
+ UE->Msg4_ACKed = false;
+
+ if (CellGroup &&
+ CellGroup->spCellConfig &&
+ CellGroup->spCellConfig->spCellConfigDedicated &&
+ CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
+ CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
+ compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE);
+ }
+
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
- sched_ctrl->set_mcs = true;
+ sched_ctrl->dl_max_mcs = 28; /* do not limit MCS for individual UEs */
+ sched_ctrl->set_pmi = false;
sched_ctrl->ta_frame = 0;
sched_ctrl->ta_update = 31;
sched_ctrl->ta_apply = false;
@@ -2330,7 +2433,6 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
sched_ctrl->pucch_consecutive_dtx_cnt = 0;
sched_ctrl->pusch_consecutive_dtx_cnt = 0;
sched_ctrl->ul_failure = 0;
-
sched_ctrl->sched_srs.frame = -1;
sched_ctrl->sched_srs.slot = -1;
sched_ctrl->sched_srs.srs_scheduled = false;
@@ -2340,11 +2442,8 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
sched_ctrl->pusch_semi_static.time_domain_allocation = -1;
const NR_ServingCellConfig_t *servingCellConfig = CellGroup && CellGroup->spCellConfig ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
- /* Set default BWPs */
- const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL;
- if (bwpList) AssertFatal(bwpList->list.count == 1,
- "downlinkBWP_ToAddModList has %d BWP!\n",
- bwpList->list.count);
+ /* Set default BWPs */
+ const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : 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;
@@ -2357,26 +2456,32 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
scc,
sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL,
target_ss);
- sched_ctrl->coreset = get_coreset(mod_idP, scc,
- sched_ctrl->active_bwp ? (void*)sched_ctrl->active_bwp->bwp_Dedicated : NULL,
- sched_ctrl->search_space, target_ss);
- sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[mod_idP],
+ sched_ctrl->coreset = get_coreset(nr_mac,
+ scc,
+ sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL,
+ sched_ctrl->search_space,
+ target_ss);
+ sched_ctrl->sched_pdcch = set_pdcch_structure(nr_mac,
sched_ctrl->search_space,
sched_ctrl->coreset,
scc,
genericParameters,
NULL);
+ sched_ctrl->next_dl_bwp_id = -1;
+ sched_ctrl->next_ul_bwp_id = -1;
const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL;
- if (ubwpList) AssertFatal(ubwpList->list.count == 1,
+ if (ubwpList)
+ AssertFatal(ubwpList->list.count <= NR_MAX_NUM_BWP,
"uplinkBWP_ToAddModList has %d BWP!\n",
ubwpList->list.count);
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);
+ if (servingCellConfig)
+ AssertFatal(servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
+ "no pdsch-ServingCellConfig found for UE %04x\n",
+ UE->rnti);
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
// pdsch == NULL in SA -> will create default (8) number of HARQ processes
create_dl_harq_list(sched_ctrl, pdsch);
@@ -2387,21 +2492,27 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
add_tail_nr_list(&sched_ctrl->available_ul_harq, harq);
create_nr_list(&sched_ctrl->feedback_ul_harq, 16);
create_nr_list(&sched_ctrl->retrans_ul_harq, 16);
- LOG_D(NR_MAC, "[gNB %d] Add NR UE_id %d : rnti %x\n",
- mod_idP,
- UE_id,
- rntiP);
- dump_nr_list(&UE_info->list);
- return (UE_id);
+
+ pthread_mutex_lock(&UE_info->mutex);
+ int i;
+ for(i=0; ilist[i] == NULL) {
+ UE_info->list[i] = UE;
+ break;
+ }
+ if (i == MAX_MOBILES_PER_GNB) {
+ LOG_E(NR_MAC,"Try to add UE %04x but the list is full\n", rntiP);
+ delete_nr_ue_data(UE, nr_mac->common_channels);
+ pthread_mutex_unlock(&UE_info->mutex);
+ return NULL;
}
+ pthread_mutex_unlock(&UE_info->mutex);
- // printf("MAC: cannot add new UE for rnti %x\n", rntiP);
- LOG_E(NR_MAC, "error in add_new_ue(), could not find space in UE_info, Dumping UE list\n");
- dump_nr_list(&UE_info->list);
- return -1;
+ LOG_D(NR_MAC, "Add NR rnti %x\n", rntiP);
+ dump_nr_list(UE_info->list);
+ return (UE);
}
-
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 ?
@@ -2434,66 +2545,30 @@ void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
}
}
-/* hack data to remove UE in the phy */
-int rnti_to_remove[10];
-volatile int rnti_to_remove_count;
-pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
+void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti)
{
- int UE_id;
- int i;
- int cc_id;
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
+ NR_UEs_t *UE_info = &nr_mac->UE_info;
+ pthread_mutex_lock(&UE_info->mutex);
+ UE_iterator(UE_info->list, UE) {
+ if (UE->rnti==rnti)
+ break;
+ }
- for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
+ if (!UE) {
+ LOG_W(NR_MAC,"Call to del rnti %04x, but not existing\n", rnti);
+ pthread_mutex_unlock(&UE_info->mutex);
+ return;
+ }
- if (UE_info->active[i] != TRUE)
- continue;
- if (UE_info->rnti[i] != rnti)
- continue;
+ NR_UE_info_t * newUEs[MAX_MOBILES_PER_GNB+1]={0};
+ int newListIdx=0;
+ for (int i=0; ilist[i] && UE_info->list[i]->rnti != rnti)
+ newUEs[newListIdx++]=UE_info->list[i];
+ memcpy(UE_info->list, newUEs, sizeof(UE_info->list));
+ pthread_mutex_unlock(&UE_info->mutex);
- /* UE found, remove it */
- UE_id = i;
-
- UE_info->num_UEs--;
- UE_info->active[UE_id] = FALSE;
- UE_info->rnti[UE_id] = 0;
- remove_nr_list(&UE_info->list, UE_id);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- destroy_nr_list(&sched_ctrl->available_dl_harq);
- destroy_nr_list(&sched_ctrl->feedback_dl_harq);
- destroy_nr_list(&sched_ctrl->retrans_dl_harq);
- 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 0x%04x\n",
- mod_id,
- UE_id,
- rnti);
-
- /* hack to remove UE in the phy */
- if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1);
- if (rnti_to_remove_count == 10) exit(1);
- rnti_to_remove[rnti_to_remove_count] = rnti;
- LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti);
- rnti_to_remove_count++;
- if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
- }
-
- /* clear RA process(es?) associated to the UE */
- for (cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) {
- NR_COMMON_channels_t *cc = &RC.nrmac[mod_id]->common_channels[cc_id];
- for (i = 0; i < NR_NB_RA_PROC_MAX; i++) {
- if (cc->ra[i].rnti == rnti) {
- LOG_D(NR_MAC, "free RA process %d for rnti %d\n", i, rnti);
- /* is it enough? */
- cc->ra[i].cfra = false;
- cc->ra[i].rnti = 0;
- cc->ra[i].crnti = 0;
- }
- }
- }
+ delete_nr_ue_data(UE, nr_mac->common_channels);
}
void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti) {
@@ -2517,20 +2592,18 @@ uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
}
-void get_pdsch_to_harq_feedback(int Mod_idP,
- int UE_id,
+void get_pdsch_to_harq_feedback(NR_UE_info_t *UE,
int bwp_id,
NR_SearchSpace__searchSpaceType_PR ss_type,
int *max_fb_time,
uint8_t *pdsch_to_harq_feedback) {
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
NR_BWP_DownlinkDedicated_t *bwpd=NULL;
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
if (ss_type == NR_SearchSpace__searchSpaceType_PR_ue_Specific) {
- AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE_id %d\n",UE_id);
+ AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE %04x\n",UE->rnti);
AssertFatal(CellGroup->spCellConfig!=NULL,"Cellgroup->spCellConfig is null\n");
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated!=NULL,"CellGroup->spCellConfig->spCellConfigDedicated is null\n");
}
@@ -2588,7 +2661,6 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
pdsch_to_harq_feedback[i] = i+1;
if(pdsch_to_harq_feedback[i]>*max_fb_time)
*max_fb_time = pdsch_to_harq_feedback[i];
-
}
}
else {
@@ -2606,28 +2678,25 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
}
}
-
-
void nr_csirs_scheduling(int Mod_idP,
frame_t frame,
sub_frame_t slot,
int n_slots_frame){
int CC_id = 0;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_list_t *UE_list = &UE_info->list;
+ NR_UEs_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP];
uint16_t *vrb_map = gNB_mac->common_channels[CC_id].vrb_map;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+ UE_info->sched_csirs = false;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(UE_info->list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->rrc_processing_timer > 0) {
continue;
}
-
- NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
!CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig) continue;
@@ -2640,9 +2709,10 @@ void nr_csirs_scheduling(int Mod_idP,
int period, offset;
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
- NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
- &sched_ctrl->active_bwp->bwp_Common->genericParameters:
+ NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
+ &sched_ctrl->active_bwp->bwp_Common->genericParameters :
&gNB_mac->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+
for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping;
@@ -2651,6 +2721,7 @@ void nr_csirs_scheduling(int Mod_idP,
if((frame*n_slots_frame+slot-offset)%period == 0) {
LOG_D(NR_MAC,"Scheduling CSI-RS in frame %d slot %d\n",frame,slot);
+ UE_info->sched_csirs = true;
nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -2659,16 +2730,27 @@ void nr_csirs_scheduling(int Mod_idP,
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15;
- csirs_pdu_rel15->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth,275);
- csirs_pdu_rel15->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,275);
csirs_pdu_rel15->subcarrier_spacing = genericParameters->subcarrierSpacing;
if (genericParameters->cyclicPrefix)
csirs_pdu_rel15->cyclic_prefix = *genericParameters->cyclicPrefix;
else
csirs_pdu_rel15->cyclic_prefix = 0;
- csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
- csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+ // According to last paragraph of TS 38.214 5.2.2.3.1
+ uint16_t BWPSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ uint16_t BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ if (resourceMapping.freqBand.startingRB < BWPStart) {
+ csirs_pdu_rel15->start_rb = BWPStart;
+ } else {
+ csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
+ }
+ if (resourceMapping.freqBand.nrofRBs > (BWPStart + BWPSize - csirs_pdu_rel15->start_rb)) {
+ csirs_pdu_rel15->nr_of_rbs = BWPStart + BWPSize - csirs_pdu_rel15->start_rb;
+ } else {
+ csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+ }
+ AssertFatal(csirs_pdu_rel15->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_pdu_rel15->nr_of_rbs);
+
csirs_pdu_rel15->csi_type = 1; // NZP-CSI-RS
csirs_pdu_rel15->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
if (resourceMapping.firstOFDMSymbolInTimeDomain2)
@@ -2689,20 +2771,20 @@ void nr_csirs_scheduling(int Mod_idP,
csirs_pdu_rel15->row = 1;
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
csirs_pdu_rel15->row = 2;
csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<4)&0xff0));
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
csirs_pdu_rel15->row = 4;
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
@@ -2714,18 +2796,18 @@ void nr_csirs_scheduling(int Mod_idP,
case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
csirs_pdu_rel15->row = 3;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
csirs_pdu_rel15->row = 5;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 8;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
}
else{
int num_k = 0;
@@ -2734,12 +2816,12 @@ void nr_csirs_scheduling(int Mod_idP,
if(num_k==4) {
csirs_pdu_rel15->row = 6;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
}
else {
csirs_pdu_rel15->row = 7;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
}
}
break;
@@ -2747,12 +2829,12 @@ void nr_csirs_scheduling(int Mod_idP,
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 10;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
}
else {
csirs_pdu_rel15->row = 9;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
}
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
@@ -2761,24 +2843,24 @@ void nr_csirs_scheduling(int Mod_idP,
else
csirs_pdu_rel15->row = 11;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 14;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+ vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
}
else{
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
csirs_pdu_rel15->row = 15;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
}
else {
csirs_pdu_rel15->row = 13;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+ vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
}
}
break;
@@ -2786,18 +2868,18 @@ void nr_csirs_scheduling(int Mod_idP,
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 17;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+ vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
}
else{
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
csirs_pdu_rel15->row = 18;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
+ vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
}
else {
csirs_pdu_rel15->row = 16;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+ vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
}
}
break;
@@ -2818,30 +2900,47 @@ void nr_csirs_scheduling(int Mod_idP,
void nr_mac_update_timers(module_id_t module_id,
frame_t frame,
sub_frame_t slot) {
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
- const NR_list_t *UE_list = &UE_info->list;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
+
+ UE_iterator(UE_info->list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->rrc_processing_timer > 0) {
sched_ctrl->rrc_processing_timer--;
if (sched_ctrl->rrc_processing_timer == 0) {
- LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %d\n", frame, slot, UE_id);
+ LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %04x\n", frame, slot, UE->rnti);
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ const NR_ServingCellConfig_t *spCellConfigDedicated = cg && cg->spCellConfig ? cg->spCellConfig->spCellConfigDedicated : NULL;
+
+ // If needed, update the Dedicated BWP
+ const int current_bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
+ const int current_ubwp_id = sched_ctrl->active_ubwp ? sched_ctrl->active_ubwp->bwp_Id : 0;
+ if (spCellConfigDedicated &&
+ spCellConfigDedicated->downlinkBWP_ToAddModList &&
+ spCellConfigDedicated->uplinkConfig &&
+ spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+ if (*spCellConfigDedicated->firstActiveDownlinkBWP_Id != current_bwp_id) {
+ sched_ctrl->active_bwp = spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[*spCellConfigDedicated->firstActiveDownlinkBWP_Id - 1];
+ LOG_I(NR_MAC, "Changing to DL-BWP %li\n", sched_ctrl->active_bwp->bwp_Id);
+ }
+ if (*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id != current_ubwp_id) {
+ sched_ctrl->active_ubwp = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id - 1];
+ LOG_I(NR_MAC, "Changing to UL-BWP %li\n", sched_ctrl->active_ubwp->bwp_Id);
+ }
+ }
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
NR_BWP_DownlinkDedicated_t *bwpd = cg &&
cg->spCellConfig &&
cg->spCellConfig->spCellConfigDedicated ?
cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
- int **preferred_dl_tda = RC.nrmac[module_id]->preferred_dl_tda;
+
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
const uint8_t layers = set_dl_nrOfLayers(sched_ctrl);
- const int tda = bwp && preferred_dl_tda[bwp->bwp_Id][slot] >= 0 ?
- preferred_dl_tda[bwp->bwp_Id][slot] : (ps->time_domain_allocation >= 0 ? ps->time_domain_allocation : 0);
+ const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
nr_set_pdsch_semi_static(sib1,
scc,
@@ -2859,13 +2958,13 @@ void nr_mac_update_timers(module_id_t module_id,
cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- int **preferred_ul_tda = RC.nrmac[module_id]->preferred_ul_tda;
+
NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static;
int dci_format = get_dci_format(sched_ctrl);
const uint8_t num_dmrs_cdm_grps_no_data = (ubwp || ubwpd) ? 1 : 2;
- const int utda = ubwp && preferred_ul_tda[ubwp->bwp_Id][slot] >= 0 ?
- preferred_ul_tda[ubwp->bwp_Id][slot] : (ups->time_domain_allocation >= 0 ? ups->time_domain_allocation : 0);
+ const uint8_t nrOfLayers = 1;
+ const int utda = get_ul_tda(RC.nrmac[module_id], scc, slot);
nr_set_pusch_semi_static(sib1,
scc,
@@ -2874,312 +2973,33 @@ void nr_mac_update_timers(module_id_t module_id,
dci_format,
utda,
num_dmrs_cdm_grps_no_data,
+ nrOfLayers,
ups);
}
}
}
}
-/*void fill_nfapi_coresets_and_searchspaces(NR_CellGroupConfig_t *cg,
- nfapi_nr_coreset_t *coreset,
- nfapi_nr_search_space_t *search_space) {
+void schedule_nr_bwp_switch(module_id_t module_id,
+ frame_t frame,
+ sub_frame_t slot) {
- nfapi_nr_coreset_t *cs;
- nfapi_nr_search_space_t *ss;
- NR_ServingCellConfigCommon_t *scc=cg->spCellConfig->reconfigurationWithSync->spCellConfigCommon;
- AssertFatal(cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
- "downlinkBWP_ToAddModList has %d BWP!\n",
- cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
+ NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
- NR_BWP_Downlink_t *bwp=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0];
- struct NR_PDCCH_Config__controlResourceSetToAddModList *coreset_list = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList;
- AssertFatal(coreset_list->list.count>0,
- "cs list has 0 elements\n");
- for (int i=0;ilist.count;i++) {
- NR_ControlResourceSet_t *coreset_i=coreset_list->list.array[i];
- cs = coreset + coreset_i->controlResourceSetId;
-
- cs->coreset_id = coreset_i->controlResourceSetId;
- AssertFatal(coreset_i->frequencyDomainResources.size <=8 && coreset_i->frequencyDomainResources.size>0,
- "coreset_i->frequencyDomainResources.size=%d\n",
- (int)coreset_i->frequencyDomainResources.size);
-
- for (int f=0;ffrequencyDomainResources.size;f++)
- ((uint8_t*)&cs->frequency_domain_resources)[coreset_i->frequencyDomainResources.size-1-f]=coreset_i->frequencyDomainResources.buf[f];
-
- cs->frequency_domain_resources>>=coreset_i->frequencyDomainResources.bits_unused;
-
- cs->duration = coreset_i->duration;
- // Need to add information about TCI_StateIDs
+ // TODO: Implementation of a algorithm to perform:
+ // - DL BWP selection: sched_ctrl->next_dl_bwp_id = dl_bwp_id
+ // - UL BWP selection: sched_ctrl->next_ul_bwp_id = ul_bwp_id
- if (coreset_i->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved)
- cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED;
- else {
- cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED;
+ UE_iterator(UE_info->list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ if (sched_ctrl->rrc_processing_timer == 0 &&
+ UE->Msg4_ACKed &&
+ ((sched_ctrl->next_dl_bwp_id >= 0 && sched_ctrl->active_bwp && sched_ctrl->active_bwp->bwp_Id != sched_ctrl->next_dl_bwp_id) ||
+ (sched_ctrl->next_ul_bwp_id >= 0 && sched_ctrl->active_ubwp && sched_ctrl->active_ubwp->bwp_Id != sched_ctrl->next_ul_bwp_id))) {
- if (coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6)
- cs->reg_bundle_size = 6;
- else cs->reg_bundle_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize;
-
- if (coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6)
- cs->interleaver_size = 6;
- else cs->interleaver_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize;
-
- if (coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex)
- cs->shift_index = *coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex;
- else cs->shift_index = 0;
- }
-
- if (coreset_i->precoderGranularity == NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle)
- cs->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE;
- else cs->precoder_granularity = NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS;
- if (coreset_i->tci_PresentInDCI == NULL) cs->tci_present_in_dci = 0;
- else cs->tci_present_in_dci = 1;
-
- if (coreset_i->tci_PresentInDCI == NULL) cs->dmrs_scrambling_id = 0;
- else cs->dmrs_scrambling_id = *coreset_i->tci_PresentInDCI;
- }
-
- struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
- AssertFatal(commonSearchSpaceList->list.count>0,
- "common SearchSpace list has 0 elements\n");
- // Common searchspace list
- for (int i=0;ilist.count;i++) {
- NR_SearchSpace_t *searchSpace_i=commonSearchSpaceList->list.array[i];
- ss=search_space + searchSpace_i->searchSpaceId;
- if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId;
- switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) {
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560;
- break;
- default:
- AssertFatal(1==0,"Shouldn't get here\n");
- break;
- }
- if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration;
- else ss->duration = 1;
-
-
- AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2,
- "ss_i->monitoringSymbolsWithinSlot = %d != 2\n",
- (int)searchSpace_i->monitoringSymbolsWithinSlot->size);
- ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0];
- ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1];
-
- AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId);
- if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8)
- ss->number_of_candidates[0] = 8;
- else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1;
- if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8)
- ss->number_of_candidates[1] = 8;
- else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2;
- if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8)
- ss->number_of_candidates[2] = 8;
- else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4;
- if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8)
- ss->number_of_candidates[3] = 8;
- else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8;
- if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8)
- ss->number_of_candidates[4] = 8;
- else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16;
-
- AssertFatal(searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common,
- "searchspace %d is not common\n",(int)searchSpace_i->searchSpaceId);
- AssertFatal(searchSpace_i->searchSpaceType->choice.common!=NULL,
- "searchspace %d common is null\n",(int)searchSpace_i->searchSpaceId);
- ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)
- ss->css_formats_0_0_and_1_0 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) {
- ss->css_format_2_0 = 1;
- // add aggregation info
- }
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1)
- ss->css_format_2_1 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2)
- ss->css_format_2_2 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3)
- ss->css_format_2_3 = 1;
- }
-
- struct NR_PDCCH_Config__searchSpacesToAddModList *dedicatedSearchSpaceList = bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList;
- AssertFatal(dedicatedSearchSpaceList->list.count>0,
- "Dedicated Search Space list has 0 elements\n");
- // Dedicated searchspace list
- for (int i=0;ilist.count;i++) {
- NR_SearchSpace_t *searchSpace_i=dedicatedSearchSpaceList->list.array[i];
- ss=search_space + searchSpace_i->searchSpaceId;
- ss->search_space_id = searchSpace_i->searchSpaceId;
- if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId;
- switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) {
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280;
- break;
- case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560:
- ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560;
- ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560;
- break;
- default:
- AssertFatal(1==0,"Shouldn't get here\n");
- break;
- }
- if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration;
- else ss->duration = 1;
-
-
- AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2,
- "ss_i->monitoringSymbolsWithinSlot = %d != 2\n",
- (int)searchSpace_i->monitoringSymbolsWithinSlot->size);
- ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0];
- ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1];
-
- AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId);
- if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8)
- ss->number_of_candidates[0] = 8;
- else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1;
- if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8)
- ss->number_of_candidates[1] = 8;
- else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2;
- if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8)
- ss->number_of_candidates[2] = 8;
- else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4;
- if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8)
- ss->number_of_candidates[3] = 8;
- else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8;
- if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8)
- ss->number_of_candidates[4] = 8;
- else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16;
-
- if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_ue_Specific && searchSpace_i->searchSpaceType->choice.ue_Specific!=NULL) {
-
- ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC;
-
- ss->uss_dci_formats = searchSpace_i->searchSpaceType->choice.ue_Specific-> dci_Formats;
-
- } else if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common && searchSpace_i->searchSpaceType->choice.common!=NULL) {
- ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON;
-
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)
- ss->css_formats_0_0_and_1_0 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) {
- ss->css_format_2_0 = 1;
- // add aggregation info
- }
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1)
- ss->css_format_2_1 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2)
- ss->css_format_2_2 = 1;
- if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3)
- ss->css_format_2_3 = 1;
+ LOG_W(NR_MAC,"%4d.%2d UE %04x Schedule BWP switch from dl_bwp_id %ld to %ld and from ul_bwp_id %ld to %ld\n",
+ frame, slot, UE->rnti, sched_ctrl->active_bwp->bwp_Id, sched_ctrl->next_dl_bwp_id, sched_ctrl->active_ubwp->bwp_Id, sched_ctrl->next_ul_bwp_id);
+ nr_mac_rrc_bwp_switch_req(module_id, frame, slot, UE->rnti, sched_ctrl->next_dl_bwp_id, sched_ctrl->next_ul_bwp_id);
}
}
}
-*/
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
index 8680cc25d1..c156ebf36d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
@@ -34,18 +34,17 @@
extern RAN_CONTEXT_t RC;
-void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int UE_id, NR_SRS_Resource_t *srs_resource) {
+void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id,NR_UE_info_t* UE, NR_SRS_Resource_t *srs_resource) {
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &nrmac->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
sched_ctrl->active_ubwp->bwp_Common->genericParameters :
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
- srs_pdu->rnti = UE_info->rnti[UE_id];
+ srs_pdu->rnti = UE->rnti;
srs_pdu->handle = 0;
srs_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
@@ -82,7 +81,7 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int
srs_pdu->t_offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
}
-void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
+void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot];
AssertFatal(future_ul_tti_req->n_pdus <
@@ -94,7 +93,7 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR
memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t));
future_ul_tti_req->n_pdus += 1;
- nr_configure_srs(srs_pdu, module_id, CC_id, UE_id, srs_resource);
+ nr_configure_srs(srs_pdu, module_id, CC_id, UE, srs_resource);
}
/*******************************************************************
@@ -111,21 +110,19 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR
void nr_schedule_srs(int module_id, frame_t frame) {
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
- NR_UE_info_t *UE_info = &nrmac->UE_info;
- const NR_list_t *UE_list = &UE_info->list;
-
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+ NR_UEs_t *UE_info = &nrmac->UE_info;
+ UE_iterator(UE_info->list, UE) {
const int CC_id = 0;
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
sched_ctrl->sched_srs.frame = -1;
sched_ctrl->sched_srs.slot = -1;
sched_ctrl->sched_srs.srs_scheduled = false;
- if(!UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) {
+ if(!UE->Msg4_ACKed || sched_ctrl->rrc_processing_timer > 0) {
continue;
}
@@ -178,11 +175,11 @@ void nr_schedule_srs(int module_id, frame_t frame) {
// Check if UE will transmit the SRS in this frame
if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
LOG_D(NR_MAC,"Scheduling SRS reception for %d.%d\n", frame, offset%n_slots_frame);
- nr_fill_nfapi_srs(module_id, CC_id, UE_id, offset%n_slots_frame, srs_resource);
+ nr_fill_nfapi_srs(module_id, CC_id, UE, offset%n_slots_frame, srs_resource);
sched_ctrl->sched_srs.frame = frame;
sched_ctrl->sched_srs.slot = offset%n_slots_frame;
sched_ctrl->sched_srs.srs_scheduled = true;
}
}
}
-}
\ No newline at end of file
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 6a6571927a..3e36611c66 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -38,28 +38,29 @@
extern RAN_CONTEXT_t RC;
-void nr_fill_nfapi_pucch(module_id_t mod_id,
- frame_t frame,
- sub_frame_t slot,
- const NR_sched_pucch_t *pucch,
- int UE_id)
-{
- gNB_MAC_INST *nr_mac = RC.nrmac[mod_id];
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
+static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac,
+ frame_t frame,
+ sub_frame_t slot,
+ const NR_sched_pucch_t *pucch,
+ NR_UE_info_t* UE)
+{
nfapi_nr_ul_tti_request_t *future_ul_tti_req =
- &RC.nrmac[mod_id]->UL_tti_req_ahead[0][pucch->ul_slot];
+ &nrmac->UL_tti_req_ahead[0][pucch->ul_slot];
AssertFatal(future_ul_tti_req->SFN == pucch->frame
&& future_ul_tti_req->Slot == pucch->ul_slot,
- "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
+ "Current %4d.%2d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
frame,slot,
future_ul_tti_req->SFN,
future_ul_tti_req->Slot,
pucch->frame,
pucch->ul_slot);
- AssertFatal(future_ul_tti_req->n_pdus <
- sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
- "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
+ // n_pdus is number of pdus, so, in the array, it is the index of the next free element
+ if (future_ul_tti_req->n_pdus >= sizeofArray(future_ul_tti_req->pdus_list) ) {
+ LOG_E(NR_MAC,"future_ul_tti_req->n_pdus %d is full, slot: %d, sr flag %d dropping request\n",
+ future_ul_tti_req->n_pdus, pucch->ul_slot, pucch->sr_flag);
+ return;
+ }
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu;
@@ -77,9 +78,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
pucch->dai_c,
pucch->csi_bits,
pucch->resource_indicator);
-
- NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
- NR_CellGroupConfig_t *cg=UE_info->CellGroup[UE_id];
+ NR_COMMON_channels_t * common_ch=nrmac->common_channels;
+ NR_ServingCellConfigCommon_t *scc = common_ch->ServingCellConfigCommon;
+ NR_CellGroupConfig_t *cg=UE->CellGroup;
NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
@@ -88,14 +89,14 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
LOG_D(NR_MAC,"%4d.%2d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch to be scheduled in %4d.%2d\n",
frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot);
- const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ const NR_SIB1_t *sib1 = common_ch->sib1 ? common_ch->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
nr_configure_pucch(sib1,
pucch_pdu,
scc,
- UE_info->CellGroup[UE_id],
- UE_info->UE_sched_ctrl[UE_id].active_ubwp,
+ UE->CellGroup,
+ UE->UE_sched_ctrl.active_ubwp,
ubwpd,
- UE_info->rnti[UE_id],
+ UE->rnti,
pucch->resource_indicator,
pucch->csi_bits,
pucch->dai_c,
@@ -139,22 +140,18 @@ int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
};
-void nr_schedule_pucch(int Mod_idP,
+void nr_schedule_pucch(gNB_MAC_INST *nrmac,
frame_t frameP,
sub_frame_t slotP)
{
- gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP];
if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slotP / 64], slotP))
return;
- NR_UE_info_t *UE_info = &nrmac->UE_info;
- const NR_list_t *UE_list = &UE_info->list;
-
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(nrmac->UE_info.list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
const int n = sizeof(sched_ctrl->sched_pucch) / sizeof(*sched_ctrl->sched_pucch);
for (int i = 0; i < n; i++) {
- NR_sched_pucch_t *curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[i];
+ NR_sched_pucch_t *curr_pucch = &UE->UE_sched_ctrl.sched_pucch[i];
const uint16_t O_ack = curr_pucch->dai_c;
const uint16_t O_csi = curr_pucch->csi_bits;
const uint8_t O_sr = curr_pucch->sr_flag;
@@ -162,9 +159,11 @@ void nr_schedule_pucch(int Mod_idP,
|| frameP != curr_pucch->frame
|| slotP != curr_pucch->ul_slot)
continue;
- if (O_csi > 0) LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %d in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n",
- i,UE_id,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi);
- nr_fill_nfapi_pucch(Mod_idP, frameP, slotP, curr_pucch, UE_id);
+
+ if (O_csi > 0)
+ LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %04x in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n",
+ i,UE->rnti,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi);
+ nr_fill_nfapi_pucch(nrmac, frameP, slotP, curr_pucch, UE);
memset(curr_pucch, 0, sizeof(*curr_pucch));
}
}
@@ -291,7 +290,6 @@ void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
}
}
-
void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) {
@@ -503,6 +501,8 @@ void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present ==
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
+ csi_report->N1 = 1;
+ csi_report->N2 = 1;
if (i==0)
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2;
if (i==1)
@@ -512,6 +512,9 @@ void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
int n1,n2,o1,o2,x1,x2;
get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo);
get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode);
+ csi_report->N1 = n1;
+ csi_report->N2 = n2;
+ csi_report->codebook_mode = codebookConfig->codebookType.choice.type1->codebookMode;
csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1;
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2;
}
@@ -558,9 +561,8 @@ void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
AssertFatal(1==0,"Sub-band CQI reporting not yet supported");
}
-
//!TODO : same function can be written to handle csi_resources
-void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE){
uint8_t csi_report_id = 0;
uint8_t nb_resources = 0;
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
@@ -572,7 +574,7 @@ void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_in
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
// MAC structure for CSI measurement reports (per UE and per report)
- nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+ nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
// csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration
// (either CSI-RS or SSB)
csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
@@ -657,24 +659,22 @@ void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_in
}
-uint16_t nr_get_csi_bitlen(int Mod_idP,
- int UE_id,
+uint16_t nr_get_csi_bitlen(NR_UE_info_t *UE,
uint8_t csi_report_id) {
uint16_t csi_bitlen = 0;
uint16_t max_bitlen = 0;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
L1_RSRP_bitlen_t * CSI_report_bitlen = NULL;
CSI_Meas_bitlen_t * csi_meas_bitlen = NULL;
- if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type||
- NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){
- CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE->csi_report_template[csi_report_id].reportQuantity_type||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE->csi_report_template[csi_report_id].reportQuantity_type){
+ CSI_report_bitlen = &(UE->csi_report_template[csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
(CSI_report_bitlen->nb_ssbri_cri -1 )));
} else{
- csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ csi_meas_bitlen = &(UE->csi_report_template[csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
uint16_t temp_bitlen;
for (int i=0; i<8; i++) {
temp_bitlen = (csi_meas_bitlen->cri_bitlen+
@@ -700,11 +700,10 @@ void nr_csi_meas_reporting(int Mod_idP,
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_list_t *UE_list = &UE_info->list;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- const NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+
+ UE_iterator(RC.nrmac[Mod_idP]->UE_info.list, UE ) {
+ const NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if ((sched_ctrl->rrc_processing_timer > 0) || (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0)) {
continue;
}
@@ -716,16 +715,15 @@ void nr_csi_meas_reporting(int Mod_idP,
NR_PUCCH_Config_t *pucch_Config = NULL;
if (sched_ctrl->active_ubwp) {
pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup;
- } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+ } else if (CellGroup &&
+ CellGroup->spCellConfig &&
+ CellGroup->spCellConfig->spCellConfigDedicated &&
+ CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+ CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+ CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+ pucch_Config = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
}
-
for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
@@ -748,7 +746,7 @@ void nr_csi_meas_reporting(int Mod_idP,
if (*pucchresset->resourceList.list.array[res_index] == pucchcsires->pucch_Resource)
break;
AssertFatal(res_index < n,
- "CSI pucch resource %ld not found among PUCCH resources\n",pucchcsires->pucch_Resource);
+ "CSI pucch resource %ld not found among PUCCH resources\n", pucchcsires->pucch_Resource);
// find free PUCCH that is in order with possibly existing PUCCH
// schedulings (other CSI, SR)
@@ -757,13 +755,12 @@ void nr_csi_meas_reporting(int Mod_idP,
&& !curr_pucch->sr_flag
&& curr_pucch->dai_c == 0,
"PUCCH not free at index 1 for UE %04x\n",
- UE_info->rnti[UE_id]);
+ UE->rnti);
curr_pucch->r_pucch = -1;
curr_pucch->frame = frame;
curr_pucch->ul_slot = sched_slot;
curr_pucch->resource_indicator = res_index;
- curr_pucch->csi_bits +=
- nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
+ curr_pucch->csi_bits += nr_get_csi_bitlen(UE,csi_report_id);
const NR_SIB1_t *sib1 = RC.nrmac[Mod_idP]->common_channels[0].sib1 ? RC.nrmac[Mod_idP]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
@@ -815,37 +812,37 @@ void nr_csi_meas_reporting(int Mod_idP,
}
}
-__attribute__((unused))
-static void handle_dl_harq(module_id_t mod_id,
- int UE_id,
+static void handle_dl_harq(NR_UE_info_t * UE,
int8_t harq_pid,
- bool success)
+ bool success,
+ int harq_round_max)
{
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[harq_pid];
+ NR_UE_harq_t *harq = &UE->UE_sched_ctrl.harq_processes[harq_pid];
harq->feedback_slot = -1;
harq->is_waiting = false;
if (success) {
- add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
+ add_tail_nr_list(&UE->UE_sched_ctrl.available_dl_harq, harq_pid);
harq->round = 0;
harq->ndi ^= 1;
- } else if (harq->round >= RC.nrmac[mod_id]->harq_round_max - 1) {
- add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
+
+ } else if (harq->round >= harq_round_max - 1) {
+ add_tail_nr_list(&UE->UE_sched_ctrl.available_dl_harq, harq_pid);
harq->round = 0;
harq->ndi ^= 1;
- NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
- stats->dlsch_errors++;
- LOG_D(NR_MAC, "retransmission error for UE %d (total %"PRIu64")\n", UE_id, stats->dlsch_errors);
+
+ NR_mac_stats_t *stats = &UE->mac_stats;
+ stats->dl.errors++;
+ LOG_D(NR_MAC, "retransmission error for UE %04x (total %"PRIu64")\n", UE->rnti, stats->dl.errors);
+
} else {
- LOG_D(PHY,"NACK for: pid %d, ue %x\n",harq_pid, UE_id);
- add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].retrans_dl_harq, harq_pid);
+ LOG_D(PHY,"NACK for: pid %d, ue %04x\n",harq_pid, UE->rnti);
+ add_tail_nr_list(&UE->UE_sched_ctrl.retrans_dl_harq, harq_pid);
harq->round++;
}
}
-int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) {
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ;
+int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t * UE) {
+ NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
NR_TCI_State_t *tci =NULL;
int i;
@@ -870,15 +867,13 @@ int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, i
return -1;
}
-int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) {
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ;
+int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) {
+ NR_CellGroupConfig_t *CellGroup = UE->CellGroup ;
int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
NR_TCI_State_t *tci =NULL;
NR_TCI_StateId_t *tci_id = NULL;
- int bwp_id = 1;
- NR_BWP_Downlink_t *bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
- NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ NR_ControlResourceSet_t *coreset = sched_ctrl->coreset;
int i;
int flag = 0;
int tci_stateID = -1;
@@ -932,7 +927,7 @@ int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
//identifies the target SSB Beam index
//keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
//handles triggering of PDCCH and PDSCH MAC CEs
-void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
+void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) {
int strongest_ssb_rsrp = 0;
int cqi_idx = 0;
@@ -944,23 +939,20 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
int ssb_index[MAX_NUM_SSB] = {0};
int ssb_rsrp[MAX_NUM_SSB] = {0};
uint8_t idx = 0;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- int bwp_id = sched_ctrl->active_bwp ? 1 : 0;
- NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
- NR_BWP_Downlink_t *bwp = bwp_id>0 ?
- sched_ctrl->active_bwp:
- NULL;
-
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ const int bwp_id = sched_ctrl->active_bwp ? 1 : 0;
+ NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
+
//bwp indicator
int n_dl_bwp=0;
- if (CellGroup->spCellConfig->spCellConfigDedicated &&
+ if (CellGroup->spCellConfig &&
+ CellGroup->spCellConfig->spCellConfigDedicated &&
CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)
- n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
+ n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
uint8_t nr_ssbri_cri = 0;
- uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report;
+ uint8_t nb_of_csi_ssb_report = UE->csi_report_template[cqi_idx].nb_of_csi_ssb_report;
int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
uint8_t diff_rsrp_idx = 0;
uint8_t i, j;
@@ -1031,7 +1023,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
The length of the field is 7 bits
*/
if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) {
- int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+ int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], UE);
if( tci_state_id != -1)
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1041,7 +1033,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
int flag = 0;
for(i =0; ssb_index_sorted[i]!=0; i++) {
- tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ;
+ tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i],UE) ;
if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1055,7 +1047,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
}
}
} else {
- int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+ int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], UE);
if (tci_state_id !=-1)
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1065,7 +1057,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
int flag = 0;
for(i =0; ssb_index_sorted[i]!=0; i++) {
- tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id);
+ tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], UE);
if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1080,10 +1072,8 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
}
}
- sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp ?
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI :
- CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI;
-
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = sched_ctrl->coreset ?
+ sched_ctrl->coreset->tci_PresentInDCI : NULL;
//filling pdsch tci state activation deactivation mac ce structure fields
if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) {
@@ -1128,15 +1118,14 @@ uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit
}
-void evaluate_rsrp_report(NR_UE_info_t *UE_info,
+void evaluate_rsrp_report(NR_UE_info_t *UE,
NR_UE_sched_ctrl_t *sched_ctrl,
- int UE_id,
uint8_t csi_report_id,
uint8_t *payload,
int *cumul_bits,
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){
- nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+ nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
uint16_t curr_payload;
@@ -1188,7 +1177,7 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
}
csi_report->nb_of_csi_ssb_report++;
int strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report.ssb_cri_report.RSRP);
- NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+ NR_mac_stats_t *stats = &UE->mac_stats;
// including ssb rsrp in mac stats
stats->cumul_rsrp += strongest_ssb_rsrp;
stats->num_rsrp_meas++;
@@ -1252,7 +1241,12 @@ void evaluate_cqi_report(uint8_t *payload,
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb = temp_cqi;
LOG_D(MAC,"Wide-band CQI for the second TB %d\n", temp_cqi);
}
- sched_ctrl->set_mcs = TRUE;
+
+ // TODO for wideband case and multiple TB
+ const int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
+ const int mcs_table = sched_ctrl->pdsch_semi_static.mcsTableIdx;
+ const int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
+ sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_table, cqi_idx);
}
@@ -1275,6 +1269,7 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
+ sched_ctrl->set_pmi = true;
return tot_bitlen;
}
@@ -1320,22 +1315,19 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
frame_t frame,
slot_t slot,
- int UE_id,
- module_id_t Mod_idP) {
-
+ NR_UE_info_t *UE,
+ NR_ServingCellConfigCommon_t *scc)
+{
/** From Table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel */
- NR_ServingCellConfigCommon_t *scc =
- RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload;
uint16_t bitlen = uci_pdu->csi_part1.csi_part1_bit_len;
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING;
- NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
int cumul_bits = 0;
int r_index = -1;
for (int csi_report_id = 0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) {
- nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+ nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
csi_report->nb_of_csi_ssb_report = 0;
uint8_t cri_bitlen = 0;
uint8_t ri_bitlen = 0;
@@ -1350,10 +1342,10 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
LOG_D(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
switch(reportQuantity_type){
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
- evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
+ evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type);
break;
case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
- evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
+ evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type);
break;
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen;
@@ -1380,6 +1372,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
if (r_index != -1)
skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen);
pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl);
+ sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id;
cumul_bits += pmi_bitlen;
evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table);
break;
@@ -1397,6 +1390,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
if (r_index != -1)
skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen);
pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl);
+ sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id;
cumul_bits += pmi_bitlen;
evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table);
break;
@@ -1407,7 +1401,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
}
}
-static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t slot, int UE_id)
+static NR_UE_harq_t *find_harq(frame_t frame, sub_frame_t slot, NR_UE_info_t * UE, int harq_round_max)
{
/* In case of realtime problems: we can only identify a HARQ process by
* timing. If the HARQ process's feedback_frame/feedback_slot is not the one we
@@ -1415,7 +1409,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl
* skip this HARQ process, which is what happens in the loop below.
* Similarly, we might be "in advance", in which case we need to skip
* this result. */
- NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
int8_t pid = sched_ctrl->feedback_dl_harq.head;
if (pid < 0)
return NULL;
@@ -1431,7 +1425,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl
frame,
slot);
remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
- handle_dl_harq(mod_id, UE_id, pid, 0);
+ handle_dl_harq(UE, pid, 0, harq_round_max);
pid = sched_ctrl->feedback_dl_harq.head;
if (pid < 0)
return NULL;
@@ -1456,20 +1450,19 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
sub_frame_t slot,
const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01)
{
- int UE_id = find_nr_UE_id(mod_id, uci_01->rnti);
- if (UE_id < 0) {
+ NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_01->rnti);
+ if (!UE) {
LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_01->rnti);
return;
}
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (((uci_01->pduBitmap >> 1) & 0x01)) {
// iterate over received harq bits
for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
const uint8_t harq_value = uci_01->harq->harq_list[harq_bit].harq_value;
const uint8_t harq_confidence = uci_01->harq->harq_confidence_level;
- NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id);
+ NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->harq_round_max);
if (!harq) {
LOG_E(NR_MAC, "Oh no! Could not find a harq in %s!\n", __FUNCTION__);
break;
@@ -1478,8 +1471,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
const int8_t pid = sched_ctrl->feedback_dl_harq.head;
remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
LOG_D(NR_MAC,"%4d.%2d bit %d pid %d ack/nack %d\n",frame, slot, 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++;
+ handle_dl_harq(UE, pid, harq_value == 0 && harq_confidence == 0, RC.nrmac[mod_id]->harq_round_max);
+ if (harq_confidence == 1) UE->mac_stats.pucch0_DTX++;
}
}
@@ -1504,19 +1497,21 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
sub_frame_t slot,
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234)
{
- int UE_id = find_nr_UE_id(mod_id, uci_234->rnti);
- if (UE_id < 0) {
+ NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_234->rnti);
+ if (!UE) {
LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
return;
}
- AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id],"Cellgroup is null for UE %d/%x\n",UE_id,uci_234->rnti);
- AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig, "Cellgroup->spCellConfig is null for UE %d/%x\n",UE_id,uci_234->rnti);
- AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated, "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %d/%x\n",UE_id,uci_234->rnti);
- if ( RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL) return;
+ AssertFatal(UE->CellGroup,"Cellgroup is null for UE %04x\n", uci_234->rnti);
+ AssertFatal(UE->CellGroup->spCellConfig,
+ "Cellgroup->spCellConfig is null for UE %04x\n", uci_234->rnti);
+ AssertFatal(UE->CellGroup->spCellConfig->spCellConfigDedicated,
+ "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %04x\n", uci_234->rnti);
+ if ( UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL)
+ return;
- NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_CSI_MeasConfig_t *csi_MeasConfig = UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
// tpc (power control)
// TODO PUCCH2 SNR computation is not correct -> ignore the following
@@ -1529,20 +1524,20 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
// iterate over received harq bits
for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
const int acknack = ((uci_234->harq.harq_payload[harq_bit >> 3]) >> harq_bit) & 0x01;
- NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id);
+ NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->harq_round_max);
if (!harq)
break;
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, uci_234->harq.harq_crc != 1 && acknack);
+ handle_dl_harq(UE, pid, uci_234->harq.harq_crc != 1 && acknack, RC.nrmac[mod_id]->harq_round_max);
}
}
if ((uci_234->pduBitmap >> 2) & 0x01) {
//API to parse the csi report and store it into sched_ctrl
- extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
+ extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE, RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon);
//TCI handling function
- tci_handling(mod_id, UE_id,frame, slot);
+ tci_handling(UE,frame, slot);
}
if ((uci_234->pduBitmap >> 3) & 0x01) {
//@TODO:Handle CSI Report 2
@@ -1610,12 +1605,11 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl,
// if the function returns -1 it was not possible to schedule acknack
// when current pucch is ready to be scheduled nr_fill_nfapi_pucch is called
int nr_acknack_scheduling(int mod_id,
- int UE_id,
+ NR_UE_info_t *UE,
frame_t frame,
sub_frame_t slot,
int r_pucch,
int is_common) {
-
const int CC_id = 0;
const int minfbtime = RC.nrmac[mod_id]->minRXTXTIMEpdsch;
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels[CC_id].ServingCellConfigCommon;
@@ -1633,8 +1627,8 @@ int nr_acknack_scheduling(int mod_id,
* * SR uses format 0 and is allocated in the first UL (mixed) slot (and not
* later)
* * each UE has dedicated PUCCH Format 0 resources, and we use index 0! */
- NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id];
- NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_PUCCH_Config_t *pucch_Config = NULL;
if (sched_ctrl->active_ubwp) {
@@ -1669,11 +1663,13 @@ int nr_acknack_scheduling(int mod_id,
const int f = pucch->frame;
const int s = pucch->ul_slot;
LOG_D(NR_MAC, "In %s: %4d.%2d DAI = 2 pucch currently in %4d.%2d, advancing by 1 slot\n", __FUNCTION__, frame, slot, f, s);
- if (!(csi_pucch
- && csi_pucch->csi_bits > 0
- && csi_pucch->frame == f
- && csi_pucch->ul_slot == s))
- nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
+
+ if (!(csi_pucch
+ && csi_pucch->csi_bits > 0
+ && csi_pucch->frame == f
+ && csi_pucch->ul_slot == s))
+ nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE);
+
memset(pucch, 0, sizeof(*pucch));
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
if(((s + 1)%nr_slots_period) == 0)
@@ -1684,13 +1680,14 @@ int nr_acknack_scheduling(int mod_id,
// skip the CSI PUCCH if it is present and if in the next frame/slot
// and if we don't multiplex
csi_pucch->r_pucch=-1;
- if (csi_pucch
+ if (csi_pucch
&& csi_pucch->csi_bits > 0
&& csi_pucch->frame == pucch->frame
&& csi_pucch->ul_slot == pucch->ul_slot
&& !csi_pucch->simultaneous_harqcsi) {
LOG_D(NR_MAC,"Cannot multiplex csi_pucch for %d.%d\n",csi_pucch->frame,csi_pucch->ul_slot);
- nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
+ nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE);
+
memset(csi_pucch, 0, sizeof(*csi_pucch));
pucch->frame = pucch->ul_slot == n_slots_frame - 1 ? (pucch->frame + 1) % 1024 : pucch->frame;
if(((pucch->ul_slot + 1)%nr_slots_period) == 0)
@@ -1714,11 +1711,10 @@ int nr_acknack_scheduling(int mod_id,
NR_SearchSpace__searchSpaceType_PR ss_type = (is_common==0 && (sched_ctrl->active_bwp || ubwpd)) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
uint8_t pdsch_to_harq_feedback[8];
- int bwp_Id = 0;
- if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id;
+ const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
int max_fb_time = 0;
- get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, &max_fb_time, pdsch_to_harq_feedback);
+ get_pdsch_to_harq_feedback(UE, bwp_id, ss_type, &max_fb_time, pdsch_to_harq_feedback);
LOG_D(NR_MAC, "In %s: 1b. DL %4d.%2d, UL_ACK %4d.%2d, DAI_C %d\n", __FUNCTION__, frame,slot,pucch->frame,pucch->ul_slot,pucch->dai_c);
/* there is a HARQ. Check whether we can use it for this ACKNACK */
@@ -1745,14 +1741,14 @@ int nr_acknack_scheduling(int mod_id,
csi_pucch->csi_bits > 0 &&
csi_pucch->frame == f &&
csi_pucch->ul_slot == s))
- nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
+ nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE);
memset(pucch, 0, sizeof(*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;
else
pucch->ul_slot = (s + 1) % n_slots_frame;
- return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common);
+ return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common);
}
pucch->timing_indicator = i;
@@ -1778,8 +1774,8 @@ int nr_acknack_scheduling(int mod_id,
((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);
+ "expected no SR/AckNack for UE %04x in %4d.%2d, but has %d/%d for %4d.%2d\n",
+ UE->rnti, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
const int s = next_ul_slot;
pucch->frame = s < n_slots_frame ? frame : (frame + 1) % 1024;
pucch->ul_slot = s % n_slots_frame;
@@ -1829,11 +1825,11 @@ int nr_acknack_scheduling(int mod_id,
}
if (ind_found==-1) {
LOG_D(NR_MAC,
- "%4d.%2d could not find pdsch_to_harq_feedback for UE %d: earliest "
+ "%4d.%2d could not find pdsch_to_harq_feedback for UE %04x: earliest "
"ack slot %d\n",
frame,
slot,
- UE_id,
+ UE->rnti,
pucch->ul_slot);
return -1;
}
@@ -1847,8 +1843,9 @@ int nr_acknack_scheduling(int mod_id,
// FIXME currently we support at most 11 bits in pucch2 so skip also in that case
if(!csi_pucch->simultaneous_harqcsi
|| ((csi_pucch->csi_bits + csi_pucch->dai_c) >= 11)) {
+
LOG_D(NR_MAC,"Cannot multiplex csi_pucch %d +csi_pucch->dai_c %d for %d.%d\n",csi_pucch->csi_bits,csi_pucch->dai_c,csi_pucch->frame,csi_pucch->ul_slot);
- nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
+ nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE);
memset(csi_pucch, 0, sizeof(*csi_pucch));
/* advance the UL slot information in PUCCH by one so we won't schedule in
* the same slot again */
@@ -1860,7 +1857,7 @@ int nr_acknack_scheduling(int mod_id,
pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame;
else
pucch->ul_slot = (s + 1) % n_slots_frame;
- return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common);
+ return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common);
}
// multiplexing harq and csi in a pucch
else {
@@ -1897,29 +1894,26 @@ int nr_acknack_scheduling(int mod_id,
}
-void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
+void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot)
{
- gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP];
if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slot / 64], slot))
return;
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- NR_UE_info_t *UE_info = &nrmac->UE_info;
- NR_list_t *UE_list = &UE_info->list;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(nrmac->UE_info.list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->ul_failure==1) continue;
NR_PUCCH_Config_t *pucch_Config = NULL;
if (sched_ctrl->active_ubwp) {
pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup;
- } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+ } else if (UE->CellGroup &&
+ UE->CellGroup->spCellConfig &&
+ UE->CellGroup->spCellConfig->spCellConfigDedicated &&
+ UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+ UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+ UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+ pucch_Config = UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
}
else continue;
@@ -1966,7 +1960,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
continue;
nfapi_nr_pucch_pdu_t *pdu = &ul_tti_req->pdus_list[i].pucch_pdu;
/* check that it is our PUCCH F0. Assuming there can be only one */
- if (pdu->rnti == UE_info->rnti[UE_id]
+ if (pdu->rnti == UE->rnti
&& pdu->format_type == 0 // does not use NR_PUCCH_Resource__format_PR_format0
&& pdu->initial_cyclic_shift == pucch_res->format.choice.format0->initialCyclicShift
&& pdu->nr_of_symbols == pucch_res->format.choice.format0->nrofSymbols
@@ -1975,8 +1969,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
pdu->sr_flag = 1;
nfapi_allocated = true;
break;
- }
- else if (pdu->rnti == UE_info->rnti[UE_id]
+ } else if (pdu->rnti == UE->rnti
&& pdu->format_type == 2 // does not use NR_PUCCH_Resource__format_PR_format0
&& pdu->nr_of_symbols == pucch_res->format.choice.format2->nrofSymbols
&& pdu->start_symbol_index == pucch_res->format.choice.format2->startingSymbolIndex) {
@@ -1984,9 +1977,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
pdu->sr_flag = 1;
nfapi_allocated = true;
break;
-
- }
- else if (pdu->rnti == UE_info->rnti[UE_id]
+ } else if (pdu->rnti == UE->rnti
&& pdu->format_type == 1 // does not use NR_PUCCH_Resource__format_PR_format0
&& pdu->nr_of_symbols == pucch_res->format.choice.format1->nrofSymbols
&& pdu->start_symbol_index == pucch_res->format.choice.format1->startingSymbolIndex) {
@@ -1994,9 +1985,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
pdu->sr_flag = 1;
nfapi_allocated = true;
break;
-
- }
- else if (pdu->rnti == UE_info->rnti[UE_id]
+ } else if (pdu->rnti == UE->rnti
&& pdu->format_type == 3 // does not use NR_PUCCH_Resource__format_PR_format0
&& pdu->nr_of_symbols == pucch_res->format.choice.format3->nrofSymbols
&& pdu->start_symbol_index == pucch_res->format.choice.format3->startingSymbolIndex) {
@@ -2004,9 +1993,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
pdu->sr_flag = 1;
nfapi_allocated = true;
break;
-
- }
- else if (pdu->rnti == UE_info->rnti[UE_id]
+ } else if (pdu->rnti == UE->rnti
&& pdu->format_type == 4 // does not use NR_PUCCH_Resource__format_PR_format0
&& pdu->nr_of_symbols == pucch_res->format.choice.format4->nrofSymbols
&& pdu->start_symbol_index == pucch_res->format.choice.format4->startingSymbolIndex) {
@@ -2014,7 +2001,6 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
pdu->sr_flag = 1;
nfapi_allocated = true;
break;
-
}
}
@@ -2038,7 +2024,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
.resource_indicator = found,
.r_pucch = -1
};
- nr_fill_nfapi_pucch(Mod_idP, SFN, slot, &sched_sr, UE_id);
+ nr_fill_nfapi_pucch(nrmac, SFN, slot, &sched_sr, UE);
}
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 711b7d4885..f7f05fd57b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -46,138 +46,18 @@ int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
return(dci_format);
}
-void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp)
-{
- gNB_MAC_INST *nrmac = RC.nrmac[module_id];
- const int bwp_id = ubwp->bwp_Id;
- if (nrmac->preferred_ul_tda[bwp_id])
- return;
+const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) {
/* there is a mixed slot only when in TDD */
- NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
- frame_type_t frame_type = nrmac->common_channels->frame_type;
- const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
+ const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+ AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
- NR_ServingCellConfigCommonSIB_t *scc_sib1 = get_softmodem_params()->sa ?
- RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1->servingCellConfigCommon : NULL;
-
- AssertFatal(scc!=NULL || scc_sib1!=NULL,"We need one serving cell config common\n");
-
- const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
- scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
-
- NR_TDD_UL_DL_Pattern_t *tdd = NULL;
- if (scc && scc->tdd_UL_DL_ConfigurationCommon) {
- tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
- } else if (scc_sib1 && scc_sib1->tdd_UL_DL_ConfigurationCommon) {
- tdd = &scc_sib1->tdd_UL_DL_ConfigurationCommon->pattern1;
- }
-
- /* Uplink symbols are at the end of the slot */
- int symb_ulMixed = 0;
- int nr_mix_slots = 0;
- int nr_slots_period = n;
- if (tdd) {
- symb_ulMixed = ((1 << tdd->nrofUplinkSymbols) - 1) << (14 - tdd->nrofUplinkSymbols);
- nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0;
- nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
- }
- else
- // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration
- AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n");
-
- const struct NR_PUCCH_Config__resourceToAddModList *resList = ubwp->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList;
- // for the moment, just block any symbol that might hold a PUCCH, regardless
- // of the RB. This is a big simplification, as most RBs will NOT have a PUCCH
- // in the respective symbols, but it simplifies scheduling
- uint16_t symb_pucch = 0;
- for (int i = 0; i < resList->list.count; ++i) {
- const NR_PUCCH_Resource_t *resource = resList->list.array[i];
- int nrofSymbols = 0;
- int startingSymbolIndex = 0;
- switch (resource->format.present) {
- case NR_PUCCH_Resource__format_PR_format0:
- nrofSymbols = resource->format.choice.format0->nrofSymbols;
- startingSymbolIndex = resource->format.choice.format0->startingSymbolIndex;
- break;
- case NR_PUCCH_Resource__format_PR_format1:
- nrofSymbols = resource->format.choice.format1->nrofSymbols;
- startingSymbolIndex = resource->format.choice.format1->startingSymbolIndex;
- break;
- case NR_PUCCH_Resource__format_PR_format2:
- nrofSymbols = resource->format.choice.format2->nrofSymbols;
- startingSymbolIndex = resource->format.choice.format2->startingSymbolIndex;
- break;
- case NR_PUCCH_Resource__format_PR_format3:
- nrofSymbols = resource->format.choice.format3->nrofSymbols;
- startingSymbolIndex = resource->format.choice.format3->startingSymbolIndex;
- break;
- case NR_PUCCH_Resource__format_PR_format4:
- nrofSymbols = resource->format.choice.format4->nrofSymbols;
- startingSymbolIndex = resource->format.choice.format4->startingSymbolIndex;
- break;
- default:
- AssertFatal(0, "found NR_PUCCH format index %d\n", resource->format.present);
- break;
- }
- symb_pucch |= ((1 << nrofSymbols) - 1) << startingSymbolIndex;
- }
-
- /* check that TDA index 1 fits into UL slot and does not overlap with PUCCH */
- const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
- const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_UL = tdaList->list.array[0];
- const int k2 = get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp,0, mu);
- int start, len;
- SLIV2SL(tdaP_UL->startSymbolAndLength, &start, &len);
- const uint16_t symb_tda = ((1 << len) - 1) << start;
- // check whether PUCCH and TDA overlap: then, we cannot use it. Note that
- // here we assume that the PUCCH is scheduled in every slot, and on all RBs
- // (which is mostly not true, this is a simplification)
- AssertFatal((symb_pucch & symb_tda) == 0, "TDA index 0 for UL overlaps with PUCCH\n");
-
- // get largest time domain allocation (TDA) for UL slot and UL in mixed slot
- int tdaMi = -1;
- if (nr_mix_slots>0) {
- const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1];
- AssertFatal(k2 == get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu),
- "scheduler cannot handle different k2 for UL slot (%d) and UL Mixed slot (%ld)\n",
- k2,
- get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu));
- SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len);
- const uint16_t symb_tda_mi = ((1 << len) - 1) << start;
- // check whether PUCCH and TDA overlap: then, we cannot use it. Also, check
- // whether TDA is entirely within mixed slot, UL. Note that here we assume
- // that the PUCCH is scheduled in every slot, and on all RBs (which is
- // mostly not true, this is a simplification)
- if ((symb_pucch & symb_tda_mi) == 0 && (symb_ulMixed & symb_tda_mi) == symb_tda_mi) {
- tdaMi = 1;
- } else {
- LOG_E(NR_MAC,
- "TDA index 1 UL overlaps with PUCCH or is not entirely in mixed slot (symb_pucch %x symb_ulMixed %x symb_tda_mi %x), won't schedule UL mixed slot\n",
- symb_pucch,
- symb_ulMixed,
- symb_tda_mi);
- }
- }
-
- nrmac->preferred_ul_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_ul_tda[bwp_id]));
-
- for (int slot = 0; slot < n; ++slot) {
- const int sched_slot = (slot + k2) % n;
- nrmac->preferred_ul_tda[bwp_id][slot] = -1;
- if (frame_type == FDD || sched_slot % nr_slots_period >= tdd->nrofDownlinkSlots + nr_mix_slots)
- nrmac->preferred_ul_tda[bwp_id][slot] = 0;
- else if (nr_mix_slots && sched_slot % nr_slots_period == tdd->nrofDownlinkSlots)
- nrmac->preferred_ul_tda[bwp_id][slot] = tdaMi;
- LOG_D(MAC, "DL slot %d UL slot %d preferred_ul_tda %d\n", slot, sched_slot, nrmac->preferred_ul_tda[bwp_id][slot]);
- }
-
- if (tdd && k2 < tdd->nrofUplinkSlots) {
- LOG_W(NR_MAC,
- "k2 %d < tdd->nrofUplinkSlots %ld: not all UL slots can be scheduled\n",
- k2,
- tdd->nrofUplinkSlots);
+ if (tdd && tdd->nrofUplinkSymbols > 1) { // if there is uplink symbols in mixed slot
+ const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1;
+ if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots)
+ return 1;
}
+ return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
}
// For both UL-SCH except:
@@ -204,8 +84,8 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
// F: length of L is 0:8 or 1:16 bits wide
// R: Reserved bit, set to zero.
-int nr_process_mac_pdu(module_id_t module_idP,
- int UE_id,
+int nr_process_mac_pdu( instance_t module_idP,
+ NR_UE_info_t* UE,
uint8_t CC_id,
frame_t frameP,
sub_frame_t slot,
@@ -216,11 +96,10 @@ int nr_process_mac_pdu(module_id_t module_idP,
uint8_t done = 0;
- NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if ( pduP[0] != UL_SCH_LCID_PADDING )
- trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
+ trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, WS_C_RNTI, UE->rnti, frameP, 0, 0, 0);
#ifdef ENABLE_MAC_PAYLOAD_DEBUG
LOG_I(NR_MAC, "In %s: dumping MAC PDU in %d.%d:\n", __func__, frameP, slot);
@@ -317,7 +196,7 @@ int nr_process_mac_pdu(module_id_t module_idP,
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]) {
+ if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) {
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);
@@ -378,22 +257,23 @@ int nr_process_mac_pdu(module_id_t module_idP,
if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len))
return 0;
- rnti_t crnti = UE_info->rnti[UE_id];
- int UE_idx = UE_id;
+ rnti_t crnti = UE->rnti;
+ NR_UE_info_t* UE_idx = UE;
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]) {
+ if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) {
uint8_t *next_subpduP = pduP + mac_subheader_len + mac_len;
if ((pduP[mac_subheader_len+mac_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);
+ LOG_W(NR_MAC, " UL_SCH_LCID_SRB for rnti %04x\n", crnti);
+ UE_idx = find_nr_UE(&RC.nrmac[module_idP]->UE_info, 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_len, crnti);
+ if (UE_idx->CellGroup) {
+ LOG_D(NR_MAC, "Frame %d : ULSCH -> UL-DCCH %d (gNB %ld, %d bytes), rnti: 0x%04x \n", frameP, rx_lcid, module_idP, mac_len, crnti);
mac_rlc_data_ind(module_idP,
crnti,
module_idP,
@@ -406,7 +286,7 @@ int nr_process_mac_pdu(module_id_t module_idP,
1,
NULL);
} else {
- AssertFatal(1==0,"[UE %d] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE_id,frameP,slot,rx_lcid);
+ AssertFatal(1==0,"[UE %04x] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE->rnti,frameP,slot,rx_lcid);
}
break;
case UL_SCH_LCID_SRB3:
@@ -444,30 +324,31 @@ int nr_process_mac_pdu(module_id_t module_idP,
frameP,
0,
0,
- UE_info->rnti[UE_id],
+ UE->rnti,
CCCH,
pduP + mac_subheader_len,
mac_len,
0);
break;
- case UL_SCH_LCID_DTCH:
+ case UL_SCH_LCID_DTCH ... (UL_SCH_LCID_DTCH + 28):
// check if LCID is valid at current time.
if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len))
return 0;
- LOG_D(NR_MAC, "[UE %x] %d.%d: ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
- UE_info->rnti[UE_id],
+
+ LOG_D(NR_MAC, "[UE %04x] %d.%d : ULSCH -> UL-%s %d (gNB %ld, %d bytes)\n",
+ UE->rnti,
frameP,
slot,
rx_lcid<4?"DCCH":"DTCH",
rx_lcid,
module_idP,
mac_len);
- UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_len;
+ UE->mac_stats.ul.lc_bytes[rx_lcid] += mac_len;
mac_rlc_data_ind(module_idP,
- UE_info->rnti[UE_id],
+ UE->rnti,
module_idP,
frameP,
ENB_FLAG_YES,
@@ -518,15 +399,14 @@ int nr_process_mac_pdu(module_id_t module_idP,
return 0;
}
-void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
+void abort_nr_ul_harq( NR_UE_info_t* UE, int8_t harq_pid)
{
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid];
harq->ndi ^= 1;
harq->round = 0;
- UE_info->mac_stats[UE_id].ulsch_errors++;
+ UE->mac_stats.ul.errors++;
add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
/* the transmission failed: the UE won't send the data we expected initially,
@@ -542,11 +422,11 @@ void handle_nr_ul_harq(const int CC_idP,
sub_frame_t slot,
const nfapi_nr_crc_t *crc_pdu)
{
- gNB_MAC_INST *gNB_mac = RC.nrmac[mod_id];
- int UE_id = find_nr_UE_id(mod_id, crc_pdu->rnti);
- if (UE_id < 0) {
+ NR_UE_info_t* UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, crc_pdu->rnti);
+ if (!UE) {
+ LOG_W(NR_MAC, "handle harq for rnti %04x, in RA process\n", crc_pdu->rnti);
for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
- NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
+ NR_RA_t *ra = &RC.nrmac[mod_id]->common_channels[CC_idP].ra[i];
if (ra->state >= WAIT_Msg3 &&
ra->rnti == crc_pdu->rnti)
return;
@@ -554,8 +434,7 @@ void handle_nr_ul_harq(const int CC_idP,
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;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
int8_t harq_pid = sched_ctrl->feedback_ul_harq.head;
LOG_D(NR_MAC, "Comparing crc_pdu->harq_id vs feedback harq_pid = %d %d\n",crc_pdu->harq_id, harq_pid);
while (crc_pdu->harq_id != harq_pid || harq_pid < 0) {
@@ -569,8 +448,9 @@ void handle_nr_ul_harq(const int CC_idP,
remove_front_nr_list(&sched_ctrl->feedback_ul_harq);
sched_ctrl->ul_harq_processes[harq_pid].is_waiting = false;
- if(sched_ctrl->ul_harq_processes[harq_pid].round >= gNB_mac->harq_round_max - 1) {
- abort_nr_ul_harq(mod_id, UE_id, harq_pid);
+
+ if(sched_ctrl->ul_harq_processes[harq_pid].round >= RC.nrmac[mod_id]->harq_round_max - 1) {
+ abort_nr_ul_harq(UE, harq_pid);
} else {
sched_ctrl->ul_harq_processes[harq_pid].round++;
add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid);
@@ -590,8 +470,8 @@ void handle_nr_ul_harq(const int CC_idP,
harq_pid,
crc_pdu->rnti);
add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
- } else if (harq->round >= gNB_mac->harq_round_max - 1) {
- abort_nr_ul_harq(mod_id, UE_id, harq_pid);
+ } else if (harq->round >= RC.nrmac[mod_id]->harq_round_max - 1) {
+ abort_nr_ul_harq(UE, harq_pid);
LOG_D(NR_MAC,
"RNTI %04x: Ulharq id %d crc failed in all rounds\n",
crc_pdu->rnti,
@@ -621,15 +501,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
const uint16_t rssi){
gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP];
- NR_UE_info_t *UE_info = &gNB_mac->UE_info;
const int current_rnti = rntiP;
- const int UE_id = find_nr_UE_id(gnb_mod_idP, current_rnti);
+ LOG_D(NR_MAC, "rx_sdu for rnti %04x\n", current_rnti);
const int target_snrx10 = gNB_mac->pusch_target_snrx10;
const int pusch_failure_thres = gNB_mac->pusch_failure_thres;
-
- if (UE_id != -1) {
- NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
+
+ NR_UE_info_t* UE = find_nr_UE(&gNB_mac->UE_info, current_rnti);
+ if (UE) {
+ NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head;
if (sduP)
@@ -637,15 +517,14 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(harq_pid),
T_BUFFER(sduP, sdu_lenP));
- UE_info->mac_stats[UE_id].ulsch_total_bytes_rx += sdu_lenP;
- LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d TA %d sduP %p, rssi %d\n",
+ UE->mac_stats.ul.total_bytes += sdu_lenP;
+ LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %04x) ul_cqi %d TA %d sduP %p, rssi %d\n",
gnb_mod_idP,
harq_pid,
CC_idP,
frameP,
slotP,
current_rnti,
- UE_id,
ul_cqi,
timing_advance,
sduP,
@@ -658,11 +537,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
UE_scheduling_control->ta_update = timing_advance;
UE_scheduling_control->raw_rssi = rssi;
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
- LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d(SNRx10 %d) and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->pusch_snrx10,UE_scheduling_control->ta_update);
+
+ LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
}
else{
- LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id);
+ LOG_D(NR_MAC,"[UE %04x] Detected DTX : increasing UE TX power\n",UE->rnti);
UE_scheduling_control->tpc0 = 1;
+
}
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
@@ -680,13 +561,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
if (sduP != NULL){
LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
- UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt = 0;
+ UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
const uint32_t tb_size = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.tb_size;
UE_scheduling_control->sched_ul_bytes -= tb_size;
if (UE_scheduling_control->sched_ul_bytes < 0)
UE_scheduling_control->sched_ul_bytes = 0;
- nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP);
+ nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP);
}
else {
NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
@@ -698,13 +579,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
UE_scheduling_control->sched_ul_bytes = 0;
}
if (ul_cqi <= 128) {
- UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt++;
- UE_info->mac_stats[UE_id].ulsch_DTX++;
+ UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt++;
+ UE->mac_stats.ulsch_DTX++;
}
- if (!get_softmodem_params()->phy_test && UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt >= pusch_failure_thres) {
- LOG_W(NR_MAC,"%d.%d Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n",
- frameP,slotP,UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt);
- UE_info->UE_sched_ctrl[UE_id].ul_failure = 1;
+
+ if (!get_softmodem_params()->phy_test && UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt >= pusch_failure_thres) {
+ LOG_W(NR_MAC,"Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n",
+ UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt);
+ UE->UE_sched_ctrl.ul_failure = 1;
+
nr_mac_gNB_rrc_ul_failure(gnb_mod_idP,CC_idP,frameP,slotP,rntiP);
}
}
@@ -725,7 +608,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP),
T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */,
T_BUFFER(sduP, sdu_lenP));
-
+
/* we don't know this UE (yet). Check whether there is a ongoing RA (Msg 3)
* and check the corresponding UE's RNTI match, in which case we activate
* it. */
@@ -733,7 +616,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
if (ra->state != WAIT_Msg3)
continue;
-
+
if(no_sig) {
LOG_D(NR_MAC, "Random Access %i failed at state %i (no signal)\n", i, ra->state);
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
@@ -756,20 +639,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
continue;
}
- int UE_id=-1;
- UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
- if (UE_id<0) {
- LOG_D(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
+ NR_UE_info_t* UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
+ if (!UE) {
+ LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
+
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
return;
}
- UE_info->UE_beam_index[UE_id] = ra->beam_id;
+ UE->UE_beam_index = ra->beam_id;
// re-initialize ta update variables after RA procedure completion
- UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP;
+ UE->UE_sched_ctrl.ta_frame = frameP;
LOG_D(NR_MAC,
"reset RA state information for RA-RNTI 0x%04x/index %d\n",
@@ -778,27 +661,24 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
LOG_I(NR_MAC,
"[gNB %d][RAPROC] PUSCH with TC_RNTI 0x%04x received correctly, "
- "adding UE MAC Context UE_id %d/RNTI 0x%04x\n",
+ "adding UE MAC Context RNTI 0x%04x\n",
gnb_mod_idP,
current_rnti,
- UE_id,
ra->rnti);
- NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10,ul_cqi,30);
if (timing_advance != 0xffff)
UE_scheduling_control->ta_update = timing_advance;
UE_scheduling_control->raw_rssi = rssi;
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
- LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
+ LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
if(ra->cfra) {
- LOG_A(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti);
+ LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti);
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
- UE_info->active[UE_id] = true;
-
process_CellGroup(ra->CellGroup, UE_scheduling_control);
} else {
@@ -814,25 +694,25 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
// First byte corresponds to R/LCID MAC sub-header
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
- if (nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
+ if (nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
ra->state = Msg4;
ra->Msg4_frame = (frameP + 2) % 1024;
ra->Msg4_slot = 1;
if (ra->msg3_dcch_dtch) {
// Check if the UE identified by C-RNTI still exists at the gNB
- int UE_id_C = find_nr_UE_id(gnb_mod_idP, ra->crnti);
- if (UE_id_C < 0) {
+ NR_UE_info_t * UE_C = find_nr_UE(&gNB_mac->UE_info, ra->crnti);
+ if (!UE_C) {
// The UE identified by C-RNTI no longer exists at the gNB
// Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better solution may be implemented
- mac_remove_nr_ue(gnb_mod_idP, ra->rnti);
+ mac_remove_nr_ue(gNB_mac, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
return;
} else {
// The UE identified by C-RNTI still exists at the gNB
// Reset uplink failure flags/counters/timers at MAC and at RRC so gNB will resume again scheduling resources for this UE
- UE_info->UE_sched_ctrl[UE_id_C].pusch_consecutive_dtx_cnt = 0;
- UE_info->UE_sched_ctrl[UE_id_C].ul_failure = 0;
+ UE_C->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
+ UE_C->UE_sched_ctrl.ul_failure = 0;
nr_mac_gNB_rrc_ul_failure_reset(gnb_mod_idP, frameP, slotP, ra->crnti);
}
}
@@ -871,7 +751,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
return;
}
+
LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
+
ra->msg3_round++;
ra->state = Msg3_retransmission;
}
@@ -903,37 +785,37 @@ long get_K2(NR_ServingCellConfigCommon_t *scc,
return 3;
}
-bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t frame, sub_frame_t slot)
+static bool nr_UE_is_to_be_scheduled(const NR_ServingCellConfigCommon_t *scc,
+ int CC_id, NR_UE_info_t* UE, frame_t frame, sub_frame_t slot, uint32_t ulsch_max_frame_inactivity)
{
- const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
const int now = frame * n + slot;
- const struct gNB_MAC_INST_s *nrmac = RC.nrmac[mod_id];
- const NR_UE_sched_ctrl_t *sched_ctrl = &nrmac->UE_info.UE_sched_ctrl[UE_id];
+
+ const NR_UE_sched_ctrl_t *sched_ctrl =&UE->UE_sched_ctrl;
+
const NR_TDD_UL_DL_Pattern_t *tdd =
scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
int num_slots_per_period;
- int last_ul_slot,last_ul_sched;
+ int last_ul_slot;
int tdd_period_len[8] = {500,625,1000,1250,2000,2500,5000,10000};
if (tdd) { // Force the default transmission in a full slot as early as possible in the UL portion of TDD period (last_ul_slot)
num_slots_per_period = n*tdd_period_len[tdd->dl_UL_TransmissionPeriodicity]/10000;
last_ul_slot=1+tdd->nrofDownlinkSlots;
- }
- else {
+ } else {
num_slots_per_period = n;
- last_ul_slot = sched_ctrl->last_ul_slot;
+ last_ul_slot = sched_ctrl->last_ul_slot;
}
- last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot;
+ const int last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot;
const int diff = (now - last_ul_sched + 1024 * n) % (1024 * n);
/* UE is to be scheduled if
* (1) we think the UE has more bytes awaiting than what we scheduled
* (2) there is a scheduling request
* (3) or we did not schedule it in more than 10 frames */
const bool has_data = sched_ctrl->estimated_ul_buffer > sched_ctrl->sched_ul_bytes;
- const bool high_inactivity = diff >= (nrmac->ulsch_max_frame_inactivity>0 ? (nrmac->ulsch_max_frame_inactivity * n) : num_slots_per_period);
+ const bool high_inactivity = diff >= (ulsch_max_frame_inactivity > 0 ? ulsch_max_frame_inactivity * n : num_slots_per_period);
LOG_D(NR_MAC,
"%4d.%2d UL inactivity %d slots has_data %d SR %d\n",
frame,
@@ -944,43 +826,34 @@ bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t
return has_data || sched_ctrl->SR || high_inactivity;
}
-int next_list_entry_looped(NR_list_t *list, int UE_id)
-{
- if (UE_id < 0)
- return list->head;
- return list->next[UE_id] < 0 ? list->head : list->next[UE_id];
-}
-
-bool allocate_ul_retransmission(module_id_t module_id,
- frame_t frame,
- sub_frame_t slot,
- uint16_t *rballoc_mask,
- int *n_rb_sched,
- int UE_id,
- int harq_pid)
+static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac,
+ frame_t frame,
+ sub_frame_t slot,
+ uint16_t *rballoc_mask,
+ int *n_rb_sched,
+ NR_UE_info_t* UE,
+ int harq_pid,
+ const NR_SIB1_t *sib1,
+ const NR_ServingCellConfigCommon_t *scc,
+ const int tda)
{
const int CC_id = 0;
- gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
- const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[CC_id].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_sched_pusch_t *retInfo = &sched_ctrl->ul_harq_processes[harq_pid].sched_pusch;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
(NR_ServingCellConfigCommon_t *)scc,
sib1);
int rbStart = 0; // wrt BWP start
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
-
+ const uint8_t nrOfLayers = 1;
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_bwp || ubwpd) ? 1 : 2;
- const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
LOG_D(NR_MAC,"retInfo->time_domain_allocation = %d, tda = %d\n", retInfo->time_domain_allocation, tda);
LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, tbs %d\n",num_dmrs_cdm_grps_no_data, retInfo->tb_size);
if (tda == retInfo->time_domain_allocation) {
@@ -992,6 +865,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
+ || ps->nrOfLayers != nrOfLayers
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
nr_set_pusch_semi_static(sib1,
scc,
@@ -1000,6 +874,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
dci_format,
tda,
num_dmrs_cdm_grps_no_data,
+ nrOfLayers,
ps);
}
@@ -1008,7 +883,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
rbStart++;
if (rbStart + retInfo->rbSize > bwpSize) {
- LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize);
+ LOG_W(NR_MAC, "cannot allocate retransmission of RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE->rnti, rbStart, retInfo->rbSize, bwpSize);
return false;
}
LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size);
@@ -1022,6 +897,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
dci_format,
tda,
num_dmrs_cdm_grps_no_data,
+ nrOfLayers,
&temp_ps);
/* the retransmission will use a different time domain allocation, check
* that we have enough resources */
@@ -1058,7 +934,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
/* Find a free CCE */
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, UE->rnti);
uint8_t nr_of_candidates;
for (int i=0; i<5; i++) {
// for now taking the lowest value among the available aggregation levels
@@ -1068,7 +944,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
1<0) break;
}
- int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
+ int CCEIndex = find_pdcch_candidate(nrmac,
CC_id,
sched_ctrl->aggregation_level,
nr_of_candidates,
@@ -1077,12 +953,12 @@ bool allocate_ul_retransmission(module_id_t module_id,
Y);
if (CCEIndex<0) {
- LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]);
+ LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE->rnti);
return false;
}
sched_ctrl->cce_index = CCEIndex;
- fill_pdcch_vrb_map(RC.nrmac[module_id],
+ fill_pdcch_vrb_map(nrmac,
CC_id,
&sched_ctrl->sched_pdcch,
CCEIndex,
@@ -1098,11 +974,10 @@ bool allocate_ul_retransmission(module_id_t module_id,
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
LOG_D(NR_MAC,
- "%4d.%2d Allocate UL retransmission UE %d/RNTI %04x sched %4d.%2d (%d RBs)\n",
+ "%4d.%2d Allocate UL retransmission RNTI %04x sched %4d.%2d (%d RBs)\n",
frame,
slot,
- UE_id,
- UE_info->rnti[UE_id],
+ UE->rnti,
sched_pusch->frame,
sched_pusch->slot,
sched_pusch->rbSize);
@@ -1129,12 +1004,20 @@ void update_ul_ue_R_Qm(NR_sched_pusch_t *sched_pusch, const NR_pusch_semi_static
}
}
-float ul_thr_ue[MAX_MOBILES_PER_GNB];
uint32_t ul_pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient
+typedef struct UEsched_s {
+ float coef;
+ NR_UE_info_t * UE;
+} UEsched_t;
+
+static int comparator(const void *p, const void *q) {
+ return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
+}
+
void pf_ul(module_id_t module_id,
frame_t frame,
sub_frame_t slot,
- NR_list_t *UE_list,
+ NR_UE_info_t *UE_list[],
int max_num_ue,
int n_rb_sched,
uint16_t *rballoc_mask) {
@@ -1142,28 +1025,29 @@ void pf_ul(module_id_t module_id,
const int CC_id = 0;
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &nrmac->UE_info;
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
- const int min_rb = nrmac->min_grant_prb;
- float coeff_ue[MAX_MOBILES_PER_GNB];
+
+ const int min_rb = 5;
// UEs that could be scheduled
- int ue_array[MAX_MOBILES_PER_GNB];
- NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB };
+ UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
+ int remainUEs=max_num_ue;
+ int curUE=0;
/* Loop UE_list to calculate throughput and coeff */
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+ UE_iterator(UE_list, UE) {
- if (UE_info->Msg4_ACKed[UE_id] != true) continue;
+ if (UE->Msg4_ACKed != true)
+ continue;
- LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id);
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %04x\n",UE->rnti);
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
scc,
sib1);
int rbStart = 0; // wrt BWP start
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
@@ -1171,40 +1055,46 @@ void pf_ul(module_id_t module_id,
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
+ const NR_mac_dir_stats_t *stats = &UE->mac_stats.ul;
/* Calculate throughput */
const float a = 0.0005f; // corresponds to 200ms window
- const uint32_t b = UE_info->mac_stats[UE_id].ulsch_current_bytes;
- ul_thr_ue[UE_id] = (1 - a) * ul_thr_ue[UE_id] + a * b;
+ const uint32_t b = stats->current_bytes;
+ UE->ul_thr_ue = (1 - a) * UE->ul_thr_ue + a * b;
/* Check if retransmission is necessary */
sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head;
- LOG_D(NR_MAC,"pf_ul: UE %d harq_pid %d\n",UE_id,sched_pusch->ul_harq_pid);
+ LOG_D(NR_MAC,"pf_ul: UE %04x harq_pid %d\n",UE->rnti,sched_pusch->ul_harq_pid);
if (sched_pusch->ul_harq_pid >= 0) {
/* Allocate retransmission*/
- bool r = allocate_ul_retransmission(
- module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pusch->ul_harq_pid);
+ const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
+ bool r = allocate_ul_retransmission(nrmac, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pusch->ul_harq_pid, sib1, scc, tda);
if (!r) {
- LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE_info->rnti[UE_id]);
+ LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE->rnti);
continue;
}
- else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE_info->rnti[UE_id],max_num_ue);
+ else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE->rnti,max_num_ue);
/* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
- max_num_ue--;
- if (max_num_ue < 0)
- return;
- continue;
- }
+ remainUEs--;
+ if (remainUEs == 0)
+ // we have filled all with mandatory retransmissions
+ // no need to schedule new transmissions
+ return;
+ continue;
+ }
const int B = max(0, sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes);
/* preprocessor computed sched_frame/sched_slot */
- const bool do_sched = nr_UE_is_to_be_scheduled(module_id, 0, UE_id, sched_pusch->frame, sched_pusch->slot);
+ const bool do_sched = nr_UE_is_to_be_scheduled(scc, 0, UE, sched_pusch->frame, sched_pusch->slot, nrmac->ulsch_max_frame_inactivity);
- LOG_D(NR_MAC,"pf_ul: do_sched UE %d => %s\n",UE_id,do_sched ? "yes" : "no");
- if ((B == 0 && !do_sched) || (sched_ctrl->rrc_processing_timer > 0)) {
+ LOG_D(NR_MAC,"pf_ul: do_sched UE %04x => %s\n",UE->rnti,do_sched ? "yes" : "no");
+ if ((B == 0 && !do_sched) || (sched_ctrl->rrc_processing_timer > 0))
continue;
- }
+
+ const NR_bler_options_t *bo = &nrmac->ul_bler;
+ const int max_mcs = bo->max_mcs; /* no per-user maximum MCS yet */
+ sched_pusch->mcs = get_mcs_from_bler(bo, stats, &UE->UE_sched_ctrl.ul_bler_stats, max_mcs, frame);
/* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled
* based on data to transmit) */
@@ -1212,42 +1102,47 @@ void pf_ul(module_id_t module_id,
/* if no data, pre-allocate 5RB */
/* Find a free CCE */
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, UE->rnti);
uint8_t nr_of_candidates;
for (int i=0; i<5; i++) {
- // for now taking the lowest value among the available aggregation levels
- find_aggregation_candidates(&sched_ctrl->aggregation_level,
- &nr_of_candidates,
- sched_ctrl->search_space,
- 1<0) break;
+ // for now taking the lowest value among the available aggregation levels
+ find_aggregation_candidates(&sched_ctrl->aggregation_level,
+ &nr_of_candidates,
+ sched_ctrl->search_space,
+ 1<0) break;
}
int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
- CC_id,
- sched_ctrl->aggregation_level,
- nr_of_candidates,
- &sched_ctrl->sched_pdcch,
- sched_ctrl->coreset,
- Y);
-
+ CC_id,
+ sched_ctrl->aggregation_level,
+ nr_of_candidates,
+ &sched_ctrl->sched_pdcch,
+ sched_ctrl->coreset,
+ Y);
+
if (CCEIndex<0) {
- LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE_info->rnti[UE_id]);
- continue;
+ LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE->rnti);
+ continue;
}
/* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
- max_num_ue--;
- if (max_num_ue < 0)
- return;
+ remainUEs--;
+
+ if (remainUEs == 0)
+ // we have filled all with mandatory retransmissions
+ // no need to schedule new transmissions
+ return;
/* Save PUSCH field */
/* we want to avoid a lengthy deduction of DMRS and other parameters in
* every TTI if we can save it, so check whether dci_format, TDA, or
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
+ const uint8_t nrOfLayers = 1;
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2;
int dci_format = get_dci_format(sched_ctrl);
- const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+ const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
+ || ps->nrOfLayers != nrOfLayers
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
nr_set_pusch_semi_static(sib1,
scc,
@@ -1256,16 +1151,18 @@ void pf_ul(module_id_t module_id,
dci_format,
tda,
num_dmrs_cdm_grps_no_data,
+ nrOfLayers,
ps);
}
- LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart);
+ LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d num_dmrs_cdm_grps_no_data %d\n",
+ min_rb, rbStart, ps->num_dmrs_cdm_grps_no_data);
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
rbStart++;
if (rbStart + min_rb >= bwpSize) {
- LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
- UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
+ LOG_W(NR_MAC, "cannot allocate continuous UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
+ UE->rnti,rbStart,min_rb,bwpSize);
return;
}
@@ -1277,7 +1174,7 @@ void pf_ul(module_id_t module_id,
sched_ctrl->aggregation_level);
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
- sched_pusch->mcs = nrmac->min_grant_mcs;
+ sched_pusch->mcs = min(nrmac->min_grant_mcs, sched_pusch->mcs);
update_ul_ue_R_Qm(sched_pusch, ps);
sched_pusch->rbStart = rbStart;
sched_pusch->rbSize = min_rb;
@@ -1288,7 +1185,7 @@ void pf_ul(module_id_t module_id,
ps->N_PRB_DMRS * ps->num_dmrs_symb,
0, // nb_rb_oh
0,
- 1 /* NrOfLayers */)
+ ps->nrOfLayers)
>> 3;
/* Mark the corresponding RBs as used */
@@ -1300,41 +1197,27 @@ void pf_ul(module_id_t module_id,
}
/* Create UE_sched for UEs eligibale for new data transmission*/
- add_tail_nr_list(&UE_sched, UE_id);
-
/* Calculate coefficient*/
- sched_pusch->mcs = nrmac->min_grant_mcs;
const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs];
- coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id];
- LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
- b, UE_id, ul_thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]);
+ float coeff_ue = (float) tbs / UE->ul_thr_ue;
+ LOG_D(NR_MAC,"rnti %04x b %d, ul_thr_ue %f, tbs %d, coeff_ue %f\n",
+ UE->rnti, b, UE->ul_thr_ue, tbs, coeff_ue);
+ UE_sched[curUE].coef=coeff_ue;
+ UE_sched[curUE].UE=UE;
+ curUE++;
}
-
+ qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator);
+ UEsched_t *iterator=UE_sched;
+
const int min_rbSize = 5;
/* Loop UE_sched to find max coeff and allocate transmission */
- while (UE_sched.head >= 0 && max_num_ue> 0 && n_rb_sched >= min_rbSize) {
- /* Find max coeff */
- int *max = &UE_sched.head; /* Find max coeff: assume head is max */
- int *p = &UE_sched.next[*max];
- while (*p >= 0) {
- /* Find max coeff: if the current one has larger coeff, save for later */
- if (coeff_ue[*p] > coeff_ue[*max])
- max = p;
- p = &UE_sched.next[*p];
- }
- /* Find max coeff: remove the max one: do not use remove_nr_list() since it
- * goes through the whole list every time. Note that UE_sched.tail might
- * not be set correctly anymore */
- const int UE_id = *max;
- p = &UE_sched.next[*max];
- *max = UE_sched.next[*max];
- *p = -1;
+ while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
const int cid = sched_ctrl->coreset->controlResourceSetId;
- const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+ const uint16_t Y = get_Y(cid%3, slot, iterator->UE->rnti);
uint8_t nr_of_candidates;
for (int i=0; i<5; i++) {
// for now taking the lowest value among the available aggregation levels
@@ -1342,7 +1225,8 @@ void pf_ul(module_id_t module_id,
&nr_of_candidates,
sched_ctrl->search_space,
1<0) break;
+ if(nr_of_candidates>0)
+ break;
}
int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
CC_id,
@@ -1352,16 +1236,13 @@ void pf_ul(module_id_t module_id,
sched_ctrl->coreset,
Y);
if (CCEIndex<0) {
- LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]);
+ LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, iterator->UE->rnti);
+ iterator++;
continue;
}
- else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, UE_info->rnti[UE_id]);
+ else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, iterator->UE->rnti);
- /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
- max_num_ue--;
- AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue);
-
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *cg = iterator->UE->CellGroup;
NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated
&& cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
@@ -1379,11 +1260,13 @@ void pf_ul(module_id_t module_id,
/* we want to avoid a lengthy deduction of DMRS and other parameters in
* every TTI if we can save it, so check whether dci_format, TDA, or
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
+ const uint8_t nrOfLayers = 1;
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2;
int dci_format = get_dci_format(sched_ctrl);
- const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+ const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
+ || ps->nrOfLayers != nrOfLayers
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
nr_set_pusch_semi_static(sib1,
scc,
@@ -1392,6 +1275,7 @@ void pf_ul(module_id_t module_id,
dci_format,
tda,
num_dmrs_cdm_grps_no_data,
+ nrOfLayers,
ps);
}
update_ul_ue_R_Qm(sched_pusch, ps);
@@ -1405,18 +1289,18 @@ void pf_ul(module_id_t module_id,
max_rbSize++;
if (rbStart + min_rb >= bwpSize) {
- LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
- UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
+ LOG_W(NR_MAC, "cannot allocate UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d)\n",
+ iterator->UE->rnti,rbStart,min_rb,bwpSize);
return;
}
- else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
-
+ else
+ LOG_D(NR_MAC,"allocating UL data for RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d)\n", iterator->UE->rnti,rbStart,min_rb,bwpSize);
/* Calculate the current scheduling bytes and the necessary RBs */
const int B = cmax(sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes, 0);
uint16_t rbSize = 0;
uint32_t TBS = 0;
-
+
nr_find_nb_rb(sched_pusch->Qm,
sched_pusch->R,
1, // layers
@@ -1443,7 +1327,11 @@ void pf_ul(module_id_t module_id,
n_rb_sched -= sched_pusch->rbSize;
for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
+
rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= slbitmap;
+ /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
+ remainUEs--;
+ iterator++;
}
}
@@ -1460,9 +1348,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
- NR_UE_info_t *UE_info = &nr_mac->UE_info;
-
- if (UE_info->num_UEs == 0)
+ if (nr_mac->UE_info.list[0] == NULL)
+ // no UEs
return false;
const int CC_id = 0;
@@ -1471,14 +1358,15 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
* have the same K2 (we don't support multiple/different K2s via different
* TDAs yet). If the TDA is negative, it means that there is no UL slot to
* schedule now (slot + k2 is not UL slot) */
- int UE_id = UE_info->list.head;
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- const int tda = sched_ctrl->active_ubwp ? nr_mac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+ NR_UE_sched_ctrl_t *sched_ctrl = &nr_mac->UE_info.list[0]->UE_sched_ctrl;
+ const int temp_tda = get_ul_tda(nr_mac, scc, slot);
+ int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, temp_tda, mu);
+ const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) & 1023;
+ const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+ const int tda = get_ul_tda(nr_mac, scc, sched_slot);
if (tda < 0)
return false;
- int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu);
- const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) % 1024;
- const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+ DevAssert(K2 == get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu));
if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot))
return false;
@@ -1496,9 +1384,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
return false;
// Avoid slots with the SRS
- const NR_list_t *UE_list = &UE_info->list;
- for (int UE_idx = UE_list->head; UE_idx >= 0; UE_idx = UE_list->next[UE_idx]) {
- NR_sched_srs_t sched_srs = UE_info->UE_sched_ctrl[UE_idx].sched_srs;
+ UE_iterator(nr_mac->UE_info.list, UE) {
+ NR_sched_srs_t sched_srs = UE->UE_sched_ctrl.sched_srs;
if(sched_srs.srs_scheduled && sched_srs.frame==sched_frame && sched_srs.slot==sched_slot) {
return false;
}
@@ -1506,10 +1393,11 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
sched_ctrl->sched_pusch.slot = sched_slot;
sched_ctrl->sched_pusch.frame = sched_frame;
- for (UE_id = UE_info->list.next[UE_id]; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator(nr_mac->UE_info.list, UE2) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE2->UE_sched_ctrl;
AssertFatal(K2 == get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu),
- "Different K2, %d(UE%d) != %ld(UE%d)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE_id);
+ "Different K2, %d(UE%d) != %ld(UE%04x)\n",
+ K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE2->rnti);
sched_ctrl->sched_pusch.slot = sched_slot;
sched_ctrl->sched_pusch.frame = sched_frame;
}
@@ -1569,7 +1457,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
pf_ul(module_id,
frame,
slot,
- &UE_info->list,
+ nr_mac->UE_info.list,
2,
len,
rballoc_mask);
@@ -1590,7 +1478,7 @@ nr_pp_impl_ul nr_init_fr1_ulsch_preprocessor(module_id_t module_id, int CC_id)
if (mcs > 27 && mcsTableIdx == 1)
continue;
const uint8_t Qm = nr_get_Qm_dl(mcs, mcsTableIdx);
- const uint16_t R = nr_get_code_rate_dl(mcs, mcsTableIdx);
+ const uint16_t R = nr_get_code_rate_ul(mcs, mcsTableIdx);
/* note: we do not update R/Qm based on low MCS or pi2BPSK */
ul_pf_tbs[mcsTableIdx][mcs] = nr_compute_tbs(Qm,
R,
@@ -1630,29 +1518,28 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
- const NR_list_t *UE_list = &UE_info->list;
- for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
- NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ UE_iterator( UE_info->list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) continue;
- NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+ NR_CellGroupConfig_t *cg = UE->CellGroup;
NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- UE_info->mac_stats[UE_id].ulsch_current_bytes = 0;
+ UE->mac_stats.ul.current_bytes = 0;
/* dynamic PUSCH values (RB alloc, MCS, hence R, Qm, TBS) that change in
* every TTI are pre-populated by the preprocessor and used below */
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
- LOG_D(NR_MAC,"UE %x : sched_pusch->rbSize %d\n",UE_info->rnti[UE_id],sched_pusch->rbSize);
+ LOG_D(NR_MAC,"UE %04x : sched_pusch->rbSize %d\n",UE->rnti,sched_pusch->rbSize);
if (sched_pusch->rbSize <= 0)
continue;
- uint16_t rnti = UE_info->rnti[UE_id];
+ uint16_t rnti = UE->rnti;
sched_ctrl->SR = false;
int8_t harq_id = sched_pusch->ul_harq_pid;
@@ -1660,8 +1547,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
/* PP has not selected a specific HARQ Process, get a new one */
harq_id = sched_ctrl->available_ul_harq.head;
AssertFatal(harq_id >= 0,
- "no free HARQ process available for UE %d\n",
- UE_id);
+ "no free HARQ process available for UE %04x\n",
+ UE->rnti);
remove_front_nr_list(&sched_ctrl->available_ul_harq);
sched_pusch->ul_harq_pid = harq_id;
} else {
@@ -1688,9 +1575,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
/* Statistics */
AssertFatal(cur_harq->round < 8, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round);
- UE_info->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++;
+ UE->mac_stats.ul.rounds[cur_harq->round]++;
if (cur_harq->round == 0) {
- UE_info->mac_stats[UE_id].ulsch_total_bytes_scheduled += sched_pusch->tb_size;
+ UE->mac_stats.ulsch_total_bytes_scheduled += sched_pusch->tb_size;
/* Save information on MCS, TBS etc for the current initial transmission
* so we have access to it when retransmitting */
cur_harq->sched_pusch = *sched_pusch;
@@ -1710,12 +1597,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
cur_harq->round,
cur_harq->ndi);
}
- UE_info->mac_stats[UE_id].ulsch_current_bytes = sched_pusch->tb_size;
+ UE->mac_stats.ul.current_bytes = sched_pusch->tb_size;
sched_ctrl->last_ul_frame = sched_pusch->frame;
sched_ctrl->last_ul_slot = sched_pusch->slot;
LOG_D(NR_MAC,
- "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n",
+ "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d nrOfLayers %2d num_dmrs_cdm_grps_no_data %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n",
frame,
slot,
rnti,
@@ -1728,6 +1615,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
ps->nrOfSymbols,
ps->ul_dmrs_symb_pos,
sched_pusch->mcs,
+ ps->nrOfLayers,
+ ps->num_dmrs_cdm_grps_no_data,
sched_pusch->tb_size,
harq_id,
cur_harq->round,
@@ -1784,7 +1673,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
pusch_pdu->data_scrambling_id = *ps->pusch_Config->dataScramblingIdentityPUSCH;
else
pusch_pdu->data_scrambling_id = *scc->physCellId;
- pusch_pdu->nrOfLayers = 1;
+ pusch_pdu->nrOfLayers = ps->nrOfLayers;
+ pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data;
/* FAPI: DMRS */
pusch_pdu->ul_dmrs_symb_pos = ps->ul_dmrs_symb_pos;
@@ -1809,7 +1699,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
}
pusch_pdu->scid = 0; // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]
pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data;
- pusch_pdu->dmrs_ports = 1;
+ pusch_pdu->dmrs_ports = ((1<nrOfLayers) - 1);
/* FAPI: Pusch Allocation in frequency domain */
pusch_pdu->resource_alloc = 1; //type 1
@@ -1874,7 +1764,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
/* look up the PDCCH PDU for this BWP and CORESET. If it does not exist,
* create it */
- const int bwpid = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
+ const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
NR_SearchSpace_t *ss = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->search_space: RC.nrmac[module_id]->sched_ctrlCommon->search_space;
NR_ControlResourceSet_t *coreset = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->coreset: RC.nrmac[module_id]->sched_ctrlCommon->coreset;
const int coresetid = coreset->controlResourceSetId;
@@ -1890,7 +1780,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
pdcch_pdu_coreset[coresetid] = pdcch_pdu;
}
- LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %x\n", frame,slot,sched_ctrl->cce_index,rnti);
+ LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %04x\n", frame,slot,sched_ctrl->cce_index,rnti);
/* Fill PDCCH DL DCI PDU */
nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu->dci_pdu[pdcch_pdu->numDlDci];
@@ -1928,9 +1818,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
&uldci_payload,
ps->dci_format,
ps->time_domain_allocation,
- UE_info->UE_sched_ctrl[UE_id].tpc0,
+ UE->UE_sched_ctrl.tpc0,
n_ubwp,
- bwpid);
+ bwp_id);
fill_dci_pdu_rel15(scc,
cg,
dci_pdu,
@@ -1938,10 +1828,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
ps->dci_format,
rnti_types[0],
pusch_pdu->bwp_size,
- bwpid,
+ bwp_id,
+ coresetid,
nr_mac->cset0_bwp_size);
memset(sched_pusch, 0, sizeof(*sched_pusch));
}
}
-
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 9cb4dd88b2..f3dd5208d6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -42,7 +42,7 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche
void config_common(int Mod_idP,
int ssb_SubcarrierOffset,
- rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
+ int pdsch_AntennaPorts,
int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc);
@@ -76,6 +76,10 @@ void nr_mac_update_timers(module_id_t module_id,
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
frame_t frame_rxP, sub_frame_t slot_rxP);
+void schedule_nr_bwp_switch(module_id_t module_id,
+ frame_t frame,
+ sub_frame_t slot);
+
/* \brief main DL scheduler function. Calls a preprocessor to decide on
* resource allocation, then "post-processes" resource allocation (nFAPI
* messages, statistics, HARQ handling, CEs, ... */
@@ -199,7 +203,7 @@ void config_uldci(const NR_SIB1_t *sib1,
int n_ubwp,
int bwp_id);
-void nr_schedule_pucch(int Mod_idP,
+void nr_schedule_pucch(gNB_MAC_INST* nrmac,
frame_t frameP,
sub_frame_t slotP);
@@ -214,15 +218,14 @@ void nr_csi_meas_reporting(int Mod_idP,
frame_t frameP,
sub_frame_t slotP);
-int nr_acknack_scheduling(int Mod_idP,
- int UE_id,
+int nr_acknack_scheduling( int Mod_idP,
+ NR_UE_info_t * UE,
frame_t frameP,
sub_frame_t slotP,
int r_pucch,
int do_common);
-void get_pdsch_to_harq_feedback(int Mod_idP,
- int UE_id,
+void get_pdsch_to_harq_feedback(NR_UE_info_t *,
int bwp_id,
NR_SearchSpace__searchSpaceType_PR ss_type,
int *max_fb_time,
@@ -303,6 +306,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
int rnti_types,
int N_RB,
int bwp_id,
+ NR_ControlResourceSetId_t coreset_id,
uint16_t cset0_bwp_size);
void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
@@ -331,7 +335,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(
const NR_SIB1_t *sib1);
/* find coreset within the search space */
-NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
+NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac,
NR_ServingCellConfigCommon_t *scc,
void *bwp,
NR_SearchSpace_t *ss,
@@ -366,6 +370,7 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
long dci_format,
int tda,
uint8_t num_dmrs_cdm_grps_no_data,
+ uint8_t nrOfLayers,
NR_pusch_semi_static_t *ps);
uint16_t get_Y(int cid, int slot, rnti_t rnti);
@@ -382,20 +387,12 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
int x_overhead,
uint8_t numdmrscdmgroupnodata,
uint8_t tb_scaling);
-/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */
-uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
-
-/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */
-uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
int NRRIV2BW(int locationAndBandwidth,int N_RB);
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
/* Functions to manage an NR_list_t */
-void dump_nr_list(NR_list_t *listP);
void create_nr_list(NR_list_t *listP, int len);
void resize_nr_list(NR_list_t *list, int new_len);
void destroy_nr_list(NR_list_t *list);
@@ -405,13 +402,13 @@ void add_tail_nr_list(NR_list_t *listP, int id);
void add_front_nr_list(NR_list_t *listP, int id);
void remove_front_nr_list(NR_list_t *listP);
-int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP);
+NR_UE_info_t * find_nr_UE(NR_UEs_t* UEs, rnti_t rntiP);
int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP);
-int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup);
+NR_UE_info_t*add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup);
-void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti);
+void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti);
void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti);
@@ -425,7 +422,7 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
int nr_get_default_pucch_res(int pucch_ResourceCommon);
-void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE);
int get_dlscs(nfapi_nr_config_request_t *cfg);
@@ -502,18 +499,21 @@ void find_SSB_and_RO_available(module_id_t module_idP);
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps);
-void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
- NR_UE_sched_ctrl_t *sched_ctrl,
- uint8_t *target_mcs,
- uint8_t mcs_table_idx);
+uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
+ int layers,
+ int N1, int N2,
+ int xp_pdsch_antenna_ports,
+ int codebook_mode);
+
+uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx);
uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl);
-void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
-void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
+const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot);
+const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot);
-bool find_free_CCE(module_id_t module_id, sub_frame_t slot, int UE_id);
+bool find_free_CCE(sub_frame_t slot, NR_UE_info_t *UE);
bool nr_find_nb_rb(uint16_t Qm,
uint16_t R,
@@ -526,7 +526,13 @@ bool nr_find_nb_rb(uint16_t Qm,
uint32_t *tbs,
uint16_t *nb_rb);
-void nr_sr_reporting(int Mod_idP, frame_t frameP, sub_frame_t slotP);
+int get_mcs_from_bler(const NR_bler_options_t *bler_options,
+ const NR_mac_dir_stats_t *stats,
+ NR_bler_stats_t *bler_stats,
+ int max_mcs,
+ frame_t frame);
+
+void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP);
void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp);
diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c
index e047494b52..6547544a68 100644
--- a/openair2/LAYER2/NR_MAC_gNB/main.c
+++ b/openair2/LAYER2/NR_MAC_gNB/main.c
@@ -57,7 +57,7 @@ void *nrmac_stats_thread(void *arg) {
AssertFatal(fd!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno));
while (oai_exit == 0) {
- dump_mac_stats(gNB,output,MACSTATSSTRLEN,false);
+ dump_mac_stats(gNB,output,MACSTATSSTRLEN,false);
fprintf(fd,"%s\n",output);
fflush(fd);
usleep(200000);
@@ -68,43 +68,43 @@ void *nrmac_stats_thread(void *arg) {
}
void clear_mac_stats(gNB_MAC_INST *gNB) {
- memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
+ UE_iterator(gNB->UE_info.list, UE) {
+ memset(&UE->mac_stats,0,sizeof(UE->mac_stats));
+ }
}
void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp)
{
- NR_UE_info_t *UE_info = &gNB->UE_info;
int num = 1;
int stroff=0;
- if (UE_info->num_UEs == 0) return;
-
- for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
-
- const NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+ pthread_mutex_lock(&gNB->UE_info.mutex);
+ UE_iterator(gNB->UE_info.list, UE) {
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+ NR_mac_stats_t *stats = &UE->mac_stats;
const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
- stroff+=sprintf(output+stroff,"UE ID %d RNTI %04x (%d/%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n",
- UE_id,
- UE_info->rnti[UE_id],
- num++,
- UE_info->num_UEs,
- sched_ctrl->ph,
- sched_ctrl->pcmax,
- avg_rsrp,
- stats->num_rsrp_meas);
- stroff+=sprintf(output+stroff,"UE %d: CQI %d, RI %d, PMI (%d,%d)\n",
- UE_id,
- UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb,
- UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.ri+1,
- UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
- UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
- stroff+=sprintf(output+stroff,"UE %d: dlsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n",
- UE_id,
- stats->dlsch_rounds[0], stats->dlsch_rounds[1],
- stats->dlsch_rounds[2], stats->dlsch_rounds[3],
- stats->dlsch_errors,
+
+ stroff+=sprintf(output+stroff,"UE RNTI %04x (%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n",
+ UE->rnti,
+ num++,
+ sched_ctrl->ph,
+ sched_ctrl->pcmax,
+ avg_rsrp,
+ stats->num_rsrp_meas);
+ stroff+=sprintf(output+stroff,"UE %04x: CQI %d, RI %d, PMI (%d,%d)\n",
+ UE->rnti,
+ UE->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb,
+ UE->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.ri+1,
+ UE->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
+ UE->UE_sched_ctrl.CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
+
+ stroff+=sprintf(output+stroff,"UE %04x: dlsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n",
+ UE->rnti,
+
+ stats->dl.rounds[0], stats->dl.rounds[1],
+ stats->dl.rounds[2], stats->dl.rounds[3],
+ stats->dl.errors,
stats->pucch0_DTX,
sched_ctrl->dl_bler_stats.bler,
sched_ctrl->dl_bler_stats.mcs);
@@ -112,28 +112,32 @@ void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp
stats->num_rsrp_meas = 0;
stats->cumul_rsrp = 0;
}
- stroff+=sprintf(output+stroff,"UE %d: dlsch_total_bytes %"PRIu64"\n", UE_id, stats->dlsch_total_bytes);
- stroff+=sprintf(output+stroff,"UE %d: ulsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", ulsch_DTX %d, ulsch_errors %"PRIu64"\n",
- UE_id,
- stats->ulsch_rounds[0], stats->ulsch_rounds[1],
- stats->ulsch_rounds[2], stats->ulsch_rounds[3],
+ stroff+=sprintf(output+stroff,"UE %04x: dlsch_total_bytes %"PRIu64"\n", UE->rnti, stats->dl.total_bytes);
+ stroff+=sprintf(output+stroff,"UE %04x: ulsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", ulsch_DTX %d, ulsch_errors %"PRIu64", BLER %.5f MCS %d\n",
+ UE->rnti,
+ stats->ul.rounds[0], stats->ul.rounds[1],
+ stats->ul.rounds[2], stats->ul.rounds[3],
stats->ulsch_DTX,
- stats->ulsch_errors);
+ stats->ul.errors,
+ sched_ctrl->ul_bler_stats.bler,
+ sched_ctrl->ul_bler_stats.mcs);
stroff+=sprintf(output+stroff,
- "UE %d: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n",
- UE_id,
- stats->ulsch_total_bytes_scheduled, stats->ulsch_total_bytes_rx);
+ "UE %04x: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n",
+ UE->rnti,
+ stats->ulsch_total_bytes_scheduled, stats->ul.total_bytes);
for (int lc_id = 0; lc_id < 63; lc_id++) {
- if (stats->lc_bytes_tx[lc_id] > 0) {
- stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
- LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
+ if (stats->dl.lc_bytes[lc_id] > 0) {
+ stroff+=sprintf(output+stroff, "UE %04x: LCID %d: %"PRIu64" bytes TX\n", UE->rnti, lc_id, stats->dl.lc_bytes[lc_id]);
+ LOG_D(NR_MAC, "UE %04x: LCID %d: %"PRIu64" bytes TX\n", UE->rnti, lc_id, stats->dl.lc_bytes[lc_id]);
}
- if (stats->lc_bytes_rx[lc_id] > 0) {
- stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
- LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
+ if (stats->ul.lc_bytes[lc_id] > 0) {
+ stroff+=sprintf(output+stroff, "UE %04x: LCID %d: %"PRIu64" bytes RX\n", UE->rnti, lc_id, stats->ul.lc_bytes[lc_id]);
+ LOG_D(NR_MAC, "UE %04x: LCID %d: %"PRIu64" bytes RX\n", UE->rnti, lc_id, stats->ul.lc_bytes[lc_id]);
+
}
}
}
+ pthread_mutex_unlock(&gNB->UE_info.mutex);
print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL);
print_meas(&gNB->schedule_dlsch,"dlsch scheduler",NULL,NULL);
print_meas(&gNB->rlc_data_req, "rlc_data_req",NULL,NULL);
@@ -144,8 +148,6 @@ void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp
void mac_top_init_gNB(void)
{
module_id_t i;
- int list_el;
- NR_UE_info_t *UE_info;
gNB_MAC_INST *nrmac;
LOG_I(MAC, "[MAIN] Init function start:nb_nr_macrlc_inst=%d\n",RC.nb_nr_macrlc_inst);
@@ -179,6 +181,8 @@ void mac_top_init_gNB(void)
RC.nrmac[i]->first_MIB = true;
+ pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL);
+
if (get_softmodem_params()->phy_test) {
RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest;
RC.nrmac[i]->pre_processor_ul = nr_ul_preprocessor_phytest;
@@ -210,13 +214,7 @@ void mac_top_init_gNB(void)
nrmac = RC.nrmac[i];
nrmac->if_inst = NR_IF_Module_init(i);
-
- UE_info = &nrmac->UE_info;
- UE_info->num_UEs = 0;
- create_nr_list(&UE_info->list, MAX_MOBILES_PER_GNB);
- for (list_el = 0; list_el < MAX_MOBILES_PER_GNB; list_el++) {
- UE_info->active[list_el] = false;
- }
+ memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info));
}
srand48(0);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index a2c77234c0..974d6dff4a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -72,7 +72,7 @@
/* Defs */
-#define MAX_NUM_BWP 2
+#define MAX_NUM_BWP 5
#define MAX_NUM_CORESET 12
#define MAX_NUM_CCE 90
#define MAX_HARQ_ROUNDS 4
@@ -80,6 +80,8 @@
#define NR_NB_RA_PROC_MAX 4
#define MAX_NUM_OF_SSB 64
+#define MIN_NUM_PRBS_TO_SCHEDULE 5
+
/*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...).
* Especially useful in the scheduler and to keep "classes" of users. */
typedef struct {
@@ -89,6 +91,7 @@ typedef struct {
int len;
} NR_list_t;
+
typedef enum {
RA_IDLE = 0,
Msg2 = 1,
@@ -121,8 +124,10 @@ typedef struct NR_sched_pdcch {
typedef struct {
/// Flag to indicate this process is active
RA_gNB_state_t state;
- /// BWP id of RA process
- int bwp_id;
+ /// DL BWP id of RA process
+ int dl_bwp_id;
+ /// UL BWP id of RA process
+ int ul_bwp_id;
/// CORESET0 configured flag
int coreset0_configured;
/// Slot where preamble was received
@@ -343,6 +348,7 @@ typedef struct NR_sched_pucch {
typedef struct NR_pusch_semi_static_t {
int dci_format;
int time_domain_allocation;
+ uint8_t nrOfLayers;
uint8_t num_dmrs_cdm_grps_no_data;
int startSymbolIndex;
@@ -454,13 +460,12 @@ typedef struct NR_UE_harq {
//! fixme : need to enhace for the multiple TB CQI report
-typedef struct NR_DL_bler_stats {
- frame_t last_frame_slot;
+typedef struct NR_bler_stats {
+ frame_t last_frame;
float bler;
- float rd2_bler;
uint8_t mcs;
- uint64_t dlsch_rounds[8];
-} NR_DL_bler_stats_t;
+ uint64_t rounds[8];
+} NR_bler_stats_t;
//
/*! As per spec 38.214 section 5.2.1.4.2
@@ -486,6 +491,7 @@ struct CRI_RI_LI_PMI_CQI {
uint8_t wb_cqi_1tb;
uint8_t wb_cqi_2tb;
uint8_t cqi_table;
+ uint8_t csi_report_id;
};
typedef struct CRI_SSB_RSRP {
@@ -529,6 +535,9 @@ typedef struct nr_csi_report {
uint8_t nb_of_csi_ssb_report;
L1_RSRP_bitlen_t CSI_report_bitlen;
CSI_Meas_bitlen_t csi_meas_bitlen;
+ int codebook_mode;
+ int N1;
+ int N2;
} nr_csi_report_t;
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
@@ -561,6 +570,12 @@ typedef struct {
NR_BWP_Downlink_t *active_bwp;
/// the currently active BWP in UL
NR_BWP_Uplink_t *active_ubwp;
+
+ /// the next active BWP ID in DL
+ NR_BWP_Id_t next_dl_bwp_id;
+ /// the next active BWP ID in UL
+ NR_BWP_Id_t next_ul_bwp_id;
+
/// CCE index and aggregation, should be coherent with cce_list
NR_SearchSpace_t *search_space;
NR_ControlResourceSet_t *coreset;
@@ -598,6 +613,9 @@ typedef struct {
NR_pdsch_semi_static_t pdsch_semi_static;
/// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
NR_sched_pdsch_t sched_pdsch;
+ /// UE-estimated maximum MCS (from CSI-RS)
+ uint8_t dl_max_mcs;
+
/// For UL synchronization: store last UL scheduling grant
frame_t last_ul_frame;
sub_frame_t last_ul_slot;
@@ -609,7 +627,8 @@ typedef struct {
mac_rlc_status_resp_t rlc_status[NR_MAX_NUM_LCID];
/// Estimation of HARQ from BLER
- NR_DL_bler_stats_t dl_bler_stats;
+ NR_bler_stats_t dl_bler_stats;
+ NR_bler_stats_t ul_bler_stats;
uint16_t ta_frame;
int16_t ta_update;
@@ -626,7 +645,7 @@ typedef struct {
int ul_failure;
struct CSI_Report CSI_report;
bool SR;
- bool set_mcs;
+ bool set_pmi;
/// information about every HARQ process
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
/// HARQ processes that are free
@@ -658,45 +677,61 @@ typedef struct {
uicc_t *uicc;
} NRUEcontext_t;
-typedef struct {
- uint64_t lc_bytes_tx[64];
- uint64_t lc_bytes_rx[64];
- uint64_t dlsch_rounds[8];
- uint64_t dlsch_errors;
- uint64_t dlsch_total_bytes;
- int dlsch_current_bytes;
- uint64_t ulsch_rounds[8];
- uint64_t ulsch_errors;
+typedef struct NR_mac_dir_stats {
+ uint64_t lc_bytes[64];
+ uint64_t rounds[8];
+ uint64_t errors;
+ uint64_t total_bytes;
+ uint32_t current_bytes;
+} NR_mac_dir_stats_t;
+
+typedef struct NR_mac_stats {
+ NR_mac_dir_stats_t dl;
+ NR_mac_dir_stats_t ul;
uint32_t ulsch_DTX;
uint64_t ulsch_total_bytes_scheduled;
- uint64_t ulsch_total_bytes_rx;
- int ulsch_current_bytes;
uint32_t pucch0_DTX;
int cumul_rsrp;
uint8_t num_rsrp_meas;
} NR_mac_stats_t;
+typedef struct NR_bler_options {
+ double upper;
+ double lower;
+ uint8_t max_mcs;
+} NR_bler_options_t;
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
#define MAX_CSI_REPORTCONFIG 48
typedef struct {
+ rnti_t rnti;
/// scheduling control info
- nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
- NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
- NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
- NR_list_t list;
- int num_UEs;
- bool active[MAX_MOBILES_PER_GNB];
- rnti_t rnti[MAX_MOBILES_PER_GNB];
- NR_CellGroupConfig_t *CellGroup[MAX_MOBILES_PER_GNB];
+ nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
+ NR_UE_sched_ctrl_t UE_sched_ctrl;
+ NR_mac_stats_t mac_stats;
+ NR_CellGroupConfig_t *CellGroup;
/// CCE indexing
- int m[MAX_MOBILES_PER_GNB];
+ int m;
// UE selected beam index
- uint8_t UE_beam_index[MAX_MOBILES_PER_GNB];
- bool Msg4_ACKed[MAX_MOBILES_PER_GNB];
-
+ uint8_t UE_beam_index;
+ bool Msg4_ACKed;
+ /// Sched CSI-RS: scheduling decisions
+ NR_gNB_UCI_STATS_t uci_statS;
+ float ul_thr_ue;
+ float dl_thr_ue;
+ int layers;
} NR_UE_info_t;
+typedef struct {
+ /// scheduling control info
+ // last element always NULL
+ pthread_mutex_t mutex;
+ NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1];
+ bool sched_csirs;
+} NR_UEs_t;
+
+#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++)))
+
typedef void (*nr_pp_impl_dl)(module_id_t mod_id,
frame_t frame,
sub_frame_t slot);
@@ -755,7 +790,7 @@ typedef struct gNB_MAC_INST_s {
/// NFAPI DL PDU structure
nfapi_nr_tx_data_request_t TX_req[NFAPI_CC_MAX];
int pdcch_cand[MAX_NUM_CORESET];
- NR_UE_info_t UE_info;
+ NR_UEs_t UE_info;
/// UL handle
uint32_t ul_handle;
@@ -791,15 +826,8 @@ typedef struct gNB_MAC_INST_s {
/// bitmap of DLSCH slots, can hold up to 160 slots
uint64_t dlsch_slot_bitmap[3];
- /// Lookup for preferred time domain allocation for BWP, in DL, slots
- /// dynamically allocated
- int *preferred_dl_tda[MAX_NUM_BWP];
/// bitmap of ULSCH slots, can hold up to 160 slots
uint64_t ulsch_slot_bitmap[3];
- /// Lookup for preferred time domain allocation for UL BWP, dynamically
- /// allocated. The index refers to the DL slot, and the indicated TDA's k2
- /// points to the right UL slot
- int *preferred_ul_tda[MAX_NUM_BWP];
/// maximum number of slots before a UE will be scheduled ULSCH automatically
uint32_t ulsch_max_frame_inactivity;
@@ -814,11 +842,11 @@ typedef struct gNB_MAC_INST_s {
uint16_t cset0_bwp_size;
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64];
+ int xp_pdsch_antenna_ports;
+
bool first_MIB;
- double dl_bler_target_upper;
- double dl_bler_target_lower;
- double dl_rd2_bler_threshold;
- uint8_t dl_max_mcs;
+ NR_bler_options_t dl_bler;
+ NR_bler_options_t ul_bler;
uint8_t harq_round_max;
uint8_t min_grant_prb;
uint8_t min_grant_mcs;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index b5cea6bdb9..ea4b7e80c7 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -977,11 +977,6 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
exit(1);
}
- if (drb_id != 1) {
- LOG_E(PDCP, "%s:%d:%s: fatal, bad drb id %d\n",
- __FILE__, __LINE__, __FUNCTION__, drb_id);
- exit(1);
- }
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 0a8e03fc1e..7ba08aaa71 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -123,7 +123,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config
rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15;
break;
default:
- LOG_E (RLC, "Error in %s: RLC config type %d is not handled\n", __FUNCTION__, rlc_config_pr);
+ AssertFatal(0, "RLC config type %d not handled\n", rlc_config_pr);
break;
}
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index c860d847d9..8d4de8823b 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -372,9 +372,6 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc
void NR_UL_indication(NR_UL_IND_t *UL_info) {
AssertFatal(UL_info!=NULL,"UL_info is null\n");
-#ifdef DUMP_FAPI
- dump_ul(UL_info);
-#endif
module_id_t module_id = UL_info->module_id;
int CC_id = UL_info->CC_id;
NR_Sched_Rsp_t *sched_info = &NR_Sched_INFO[module_id][CC_id];
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index bd09540627..c34c65b195 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -1331,10 +1331,8 @@ uint8_t do_SIB23(uint8_t Mod_id,
(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1 = calloc(1, sizeof(struct LTE_RACH_ConfigCommon__ext1));
memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1, 0, sizeof(struct LTE_RACH_ConfigCommon__ext1));
- if (rrconfig->preambleTransMax_CE_r13) {
- (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t));
- *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = *rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum
- } else (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = NULL;
+ (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t));
+ *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum
(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13 = calloc(1, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13, 0, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h
index 37a26086b5..c76bdea53f 100644
--- a/openair2/RRC/LTE/defs_NB_IoT.h
+++ b/openair2/RRC/LTE/defs_NB_IoT.h
@@ -148,7 +148,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s {
//Measurement Report not supported in NB-IoT
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 512
+#define RRC_BUF_SIZE 1024
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index f537dcbbd2..64baf5e2ac 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -316,7 +316,7 @@ typedef enum SL_TRIGGER_e {
#define MAX_MEAS_ID 7
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 512
+#define RRC_BUF_SIZE 1024
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
@@ -484,7 +484,7 @@ typedef struct MEASUREMENT_INFO_s {
typedef struct {
char Payload[RRC_BUFFER_SIZE_MAX];
char Header[RRC_HEADER_SIZE_MAX];
- char payload_size;
+ uint16_t payload_size;
} RRC_BUFFER;
#define RRC_BUFFER_SIZE sizeof(RRC_BUFFER)
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index cd87dfd554..952f32fb10 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -207,90 +207,103 @@ nr_rrc_data_req(
return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
}
-int mac_rrc_nr_data_req(const module_id_t Mod_idP,
- const int CC_id,
- const frame_t frameP,
- const rb_id_t Srb_id,
- const rnti_t rnti,
- const uint8_t Nb_tb,
- uint8_t *const buffer_pP ){
+uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
+ const int CC_id,
+ const frame_t frameP,
+ const rb_id_t Srb_id,
+ const rnti_t rnti,
+ const uint8_t Nb_tb,
+ uint8_t *const buffer_pP ){
#ifdef DEBUG_RRC
LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%ld\n",Mod_idP,Srb_id);
#endif
- // MIBCH
- if ((Srb_id & RAB_OFFSET) == MIBCH) {
+ // MIBCH
+ if ((Srb_id & RAB_OFFSET) == MIBCH) {
- asn_enc_rval_t enc_rval;
- uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f);
- rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier;
- NR_BCCH_BCH_Message_t *mib = &carrier->mib;
+ asn_enc_rval_t enc_rval;
+ uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f);
+ rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier;
+ NR_BCCH_BCH_Message_t *mib = &carrier->mib;
- // Currently we are getting the pdcch_ConfigSIB1 from the configuration file.
- // Uncomment this function for a dynamic pdcch_ConfigSIB1.
- //channel_bandwidth_t min_channel_bw = bw_10MHz; // Must be obtained based on TS 38.101-1 Table 5.3.5-1
- //generate_pdcch_ConfigSIB1(carrier->pdcch_ConfigSIB1,
- // *carrier->servingcellconfigcommon->ssbSubcarrierSpacing,
- // carrier->mib.message.choice.mib->subCarrierSpacingCommon,
- // min_channel_bw);
+ // Currently we are getting the pdcch_ConfigSIB1 from the configuration file.
+ // Uncomment this function for a dynamic pdcch_ConfigSIB1.
+ //channel_bandwidth_t min_channel_bw = bw_10MHz; // Must be obtained based on TS 38.101-1 Table 5.3.5-1
+ //generate_pdcch_ConfigSIB1(carrier->pdcch_ConfigSIB1,
+ // *carrier->servingcellconfigcommon->ssbSubcarrierSpacing,
+ // carrier->mib.message.choice.mib->subCarrierSpacingCommon,
+ // min_channel_bw);
- mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero;
- mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero;
+ mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero;
+ mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero;
- mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
- enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
- NULL,
- (void *) mib,
- carrier->MIB,
- 24);
- LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB,
- enc_rval.encoded);
- buffer_pP[0] = carrier->MIB[0];
- buffer_pP[1] = carrier->MIB[1];
- buffer_pP[2] = carrier->MIB[2];
- LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1],
- buffer_pP[2]);
- AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
- enc_rval.failed_type->name, enc_rval.encoded);
- return (3);
- }
+ mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
+ NULL,
+ (void *) mib,
+ carrier->MIB,
+ 24);
+ LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB,
+ enc_rval.encoded);
+ buffer_pP[0] = carrier->MIB[0];
+ buffer_pP[1] = carrier->MIB[1];
+ buffer_pP[2] = carrier->MIB[2];
+ LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1],
+ buffer_pP[2]);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return 3;
+ }
// TODO BCCH SIB1 SIBs
- if ((Srb_id & RAB_OFFSET ) == BCCH) {
- memcpy(&buffer_pP[0],
- RC.nrrrc[Mod_idP]->carrier.SIB1,
- RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1);
-
+ if ((Srb_id & RAB_OFFSET) == BCCH) {
+ memcpy(&buffer_pP[0], RC.nrrrc[Mod_idP]->carrier.SIB1, RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1);
return RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1;
}
// CCCH
- if( (Srb_id & RAB_OFFSET ) == CCCH) {
+ if ((Srb_id & RAB_OFFSET) == CCCH) {
+ LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
char *payload_pP;
- uint8_t Sdu_size = 0;
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_idP], rnti);
LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
+ if (ue_context_p == NULL) {
+ LOG_E(NR_RRC,"[gNB %d] Frame %d CCCH request but no ue_context\n", Mod_idP, frameP);
+ return 0;
+ }
- AssertFatal(ue_context_p!=NULL,"failed to get ue_context, rnti %x\n",rnti);
- int payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
-
+ uint16_t payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
// check if data is there for MAC
if (payload_size > 0) {
payload_pP = ue_context_p->ue_context.Srb0.Tx_buffer.Payload;
LOG_D(NR_RRC,"[gNB %d] CCCH has %d bytes (dest: %p, src %p)\n", Mod_idP, payload_size, buffer_pP, payload_pP);
// Fill buffer
memcpy((void *)buffer_pP, (void*)payload_pP, payload_size);
- Sdu_size = payload_size;
ue_context_p->ue_context.Srb0.Tx_buffer.payload_size = 0;
}
- return Sdu_size;
+ return payload_size;
}
- return(0);
+ return 0;
+}
+int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
+ const frame_t frameP,
+ const sub_frame_t sub_frameP,
+ const rnti_t rntiP,
+ const int dl_bwp_id,
+ const int ul_bwp_id) {
+
+ struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP);
+
+ protocol_ctxt_t ctxt;
+ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0);
+ nr_rrc_reconfiguration_req(ue_context_p, &ctxt, dl_bwp_id, ul_bwp_id);
+
+ return 0;
}
int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
@@ -312,6 +325,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
// call do_RRCSetup like full procedure and extract masterCellGroup
NR_CellGroupConfig_t cellGroupConfig;
NR_ServingCellConfigCommon_t *scc=RC.nrrrc[module_idP]->carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *servingcellconfigdedicated = RC.nrrrc[module_idP]->configuration.scd;
memset(&cellGroupConfig,0,sizeof(cellGroupConfig));
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_idP]);
@@ -321,16 +335,16 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
ue_context_p->ue_context.Srb0.Active = 1;
RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p);
- fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc, &RC.nrrrc[module_idP]->configuration);
+ fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,servingcellconfigdedicated,&RC.nrrrc[module_idP]->configuration);
MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP);
f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp);
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
- NULL,
- (void *)&cellGroupConfig,
- msg->du2cu_rrc_container,
- 1024); //sizeof(msg->du2cu_rrc_container));
+ NULL,
+ (void *)&cellGroupConfig,
+ msg->du2cu_rrc_container,
+ F1AP_MAX_DU2CU_RRC_LENGTH);
if (enc_rval.encoded == -1) {
LOG_E(F1AP,"Could not encoded cellGroupConfig, failed element %s\n",enc_rval.failed_type->name);
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index e22bca592f..189ade4796 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -40,6 +40,7 @@
#include /* for _ASN_DEFAULT_STACK_MAX */
#include
#include
+#include
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "asn1_msg.h"
@@ -403,7 +404,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
NR_BWP_DownlinkCommon_t *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP;
initialDownlinkBWP->genericParameters=
configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
-
for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count; i++) {
asn1cSequenceAdd(ServCellCom->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,
@@ -411,7 +411,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i];
}
-
int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing);
int scs_scaling = scs_scaling0;
int scs_scaling2 = scs_scaling0;
@@ -520,7 +519,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
ss7->searchSpaceType->choice.common=calloc(1,sizeof(*ss7->searchSpaceType->choice.common));
ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
-
asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1, 0);
asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation, 7);
asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->pagingSearchSpace, 5);
@@ -1013,10 +1011,543 @@ long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
return c_srs;
}
+void fill_default_downlinkBWP(NR_BWP_Downlink_t *bwp,
+ int bwp_loop,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_ServingCellConfigCommon_t *scc,
+ const gNB_RrcConfigurationReq *configuration) {
+
+ /// BWP common configuration
+ bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
+ if(servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+ bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) {
+ bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+ bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+ bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+ bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+ } else {
+ bwp->bwp_Id=bwp_loop+1;
+ bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ bwp->bwp_Common->genericParameters.subcarrierSpacing = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+ bwp->bwp_Common->genericParameters.cyclicPrefix = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix;
+ }
+
+ bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+ bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
+
+ int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+
+ NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
+ coreset->controlResourceSetId=(bwp->bwp_Id<<1); // To uniquely identify each Coreset lets derive it from the BWPId
+ // frequency domain resources depends on BWP size
+ // options are 24, 48 or 96
+ coreset->frequencyDomainResources.buf = calloc(1,6);
+ if (0) {
+ if (curr_bwp < 48)
+ coreset->frequencyDomainResources.buf[0] = 0xf0;
+ else
+ coreset->frequencyDomainResources.buf[0] = 0xff;
+ if (curr_bwp < 96)
+ coreset->frequencyDomainResources.buf[1] = 0;
+ else
+ coreset->frequencyDomainResources.buf[1] = 0xff;
+ } else {
+ coreset->frequencyDomainResources.buf[0] = 0xf0;
+ coreset->frequencyDomainResources.buf[1] = 0;
+ }
+ coreset->frequencyDomainResources.buf[2] = 0;
+ coreset->frequencyDomainResources.buf[3] = 0;
+ coreset->frequencyDomainResources.buf[4] = 0;
+ coreset->frequencyDomainResources.buf[5] = 0;
+ coreset->frequencyDomainResources.size = 6;
+ coreset->frequencyDomainResources.bits_unused = 3;
+ coreset->duration=1;
+ coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+ coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+
+ coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
+ uint64_t bitmap=0;
+ switch (scc->ssb_PositionsInBurst->present) {
+ case 1 :
+ bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0])<<56;
+ break;
+ case 2 :
+ bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0])<<56;
+ break;
+ case 3 :
+ for (int i=0; i<8; i++) {
+ bitmap |= (((uint64_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[i])<<((7-i)*8));
+ }
+ break;
+ default:
+ AssertFatal(1==0,"SSB bitmap size value %d undefined (allowed values 1,2,3) \n", scc->ssb_PositionsInBurst->present);
+ }
+ NR_TCI_StateId_t *tci[64];
+ for (int i=0;i<64;i++) {
+ if ((bitmap>>(63-i))&0x01){
+ tci[i]=calloc(1,sizeof(*tci[i]));
+ *tci[i] = i;
+ ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
+ }
+ }
+ coreset->tci_StatesPDCCH_ToReleaseList = NULL;
+ coreset->tci_PresentInDCI = NULL;
+ coreset->pdcch_DMRS_ScramblingID = NULL;
+
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
+
+ NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
+ ss->searchSpaceId = (bwp->bwp_Id<<1)-1 + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId
+ ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
+ *ss->controlResourceSetId=coreset->controlResourceSetId;
+ ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
+ ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ ss->duration=NULL;
+ ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
+ ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+ // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
+ ss->monitoringSymbolsWithinSlot->buf[1] = 0;
+ ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7);
+ ss->monitoringSymbolsWithinSlot->size = 2;
+ ss->monitoringSymbolsWithinSlot->bits_unused = 2;
+ ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
+ ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+ ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
+ ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+ ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+ ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+ ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
+ ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
+ ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
+ ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
+
+ ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
+
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
+ bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+ bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
+
+ // Prepare PDSCH-TimeDomainResourceAllocation list
+ nr_rrc_config_dl_tda(scc,
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+ curr_bwp);
+
+ /// BWP dedicated configuration
+ bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+ bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
+ bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
+
+ NR_ControlResourceSet_t *coreset2 = calloc(1,sizeof(*coreset2));
+ coreset2->controlResourceSetId=(bwp->bwp_Id<<1)+1; // To uniquely identify each Coreset lets derive it from the BWPId
+ // frequency domain resources depends on BWP size
+ // options are 24, 48 or 96
+ coreset2->frequencyDomainResources.buf = calloc(1,6);
+ if (0) {
+ if (curr_bwp < 48)
+ coreset2->frequencyDomainResources.buf[0] = 0xf0;
+ else
+ coreset2->frequencyDomainResources.buf[0] = 0xff;
+ if (curr_bwp < 96)
+ coreset2->frequencyDomainResources.buf[1] = 0;
+ else
+ coreset2->frequencyDomainResources.buf[1] = 0xff;
+ } else {
+ coreset2->frequencyDomainResources.buf[0] = 0xf0;
+ coreset2->frequencyDomainResources.buf[1] = 0;
+ }
+ coreset2->frequencyDomainResources.buf[2] = 0;
+ coreset2->frequencyDomainResources.buf[3] = 0;
+ coreset2->frequencyDomainResources.buf[4] = 0;
+ coreset2->frequencyDomainResources.buf[5] = 0;
+ coreset2->frequencyDomainResources.size = 6;
+ coreset2->frequencyDomainResources.bits_unused = 3;
+ coreset2->duration=1;
+ coreset2->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+ coreset2->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+ coreset2->tci_StatesPDCCH_ToAddList=NULL;
+ coreset2->tci_StatesPDCCH_ToReleaseList = NULL;
+ coreset2->tci_PresentInDCI = NULL;
+ coreset2->pdcch_DMRS_ScramblingID = NULL;
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset2);
+
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+ NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
+ ss2->searchSpaceId=(bwp->bwp_Id<<1) + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId
+ ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
+ *ss2->controlResourceSetId=coreset2->controlResourceSetId;
+ ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
+ ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
+ ss2->duration=NULL;
+ ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
+ ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+ ss2->monitoringSymbolsWithinSlot->size = 2;
+ ss2->monitoringSymbolsWithinSlot->buf[0]=0x80;
+ ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+ ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
+ ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
+ ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+ ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
+ ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+ ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+ ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+ ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
+ ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+ ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
+ ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2);
+
+ bwp->bwp_Dedicated->pdsch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
+ calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
+ NR_TCI_State_t *tcic = calloc(1,sizeof(*tcic));
+ tcic->tci_StateId=0;
+ tcic->qcl_Type1.cell=NULL;
+ tcic->qcl_Type1.bwp_Id=NULL;
+ tcic->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+ tcic->qcl_Type1.referenceSignal.choice.ssb = 0;
+ tcic->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeD;
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcic);
+}
+
+void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
+ int bwp_loop,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_ServingCellConfigCommon_t *scc,
+ const gNB_RrcConfigurationReq *configuration,
+ int uid) {
+
+ /// BWP common configuration
+ ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
+ if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+ bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+ ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+ ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+ ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+ ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+ } else {
+ ubwp->bwp_Id=bwp_loop+1;
+ ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ ubwp->bwp_Common->genericParameters.subcarrierSpacing = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+ ubwp->bwp_Common->genericParameters.cyclicPrefix = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
+ }
+
+ ubwp->bwp_Common->rach_ConfigCommon = NULL;
+ ubwp->bwp_Common->pusch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
+ ubwp->bwp_Common->pucch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
+
+ /// BWP dedicated configuration
+ ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+
+ // PUCCH config
+ ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
+ ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
+ NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
+ ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
+ pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
+ pucch_Config->resourceSetToReleaseList = NULL;
+ NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0));
+ NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1));
+ pucchresset0->pucch_ResourceSetId = 0;
+ NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0));
+ *pucchresset0id0=0;
+ ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
+ pucchresset0->maxPayloadSize=NULL;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
+ pucchresset1->pucch_ResourceSetId = 1;
+ NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0));
+ *pucchresset1id0=1;
+ ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
+ pucchresset1->maxPayloadSize=NULL;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
+ pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
+ pucch_Config->resourceToReleaseList = NULL;
+ int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+ NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
+ pucchres0->pucch_ResourceId=0;
+ pucchres0->startingPRB=(8+uid) % (curr_bwp/2);
+ LOG_D(NR_RRC, "pucchres0->startPRB %ld uid %d curr_bwp %d\n", pucchres0->startingPRB, uid, curr_bwp);
+ pucchres0->intraSlotFrequencyHopping=NULL;
+ pucchres0->secondHopPRB=NULL;
+ pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
+ pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
+ pucchres0->format.choice.format0->initialCyclicShift=0;
+ pucchres0->format.choice.format0->nrofSymbols=1;
+ pucchres0->format.choice.format0->startingSymbolIndex=13;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
+ NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
+ pucchres2->pucch_ResourceId=1;
+ pucchres2->startingPRB=0;
+ pucchres2->intraSlotFrequencyHopping=NULL;
+ pucchres2->secondHopPRB=NULL;
+ pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
+ pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
+ pucchres2->format.choice.format2->nrofPRBs=8;
+ pucchres2->format.choice.format2->nrofSymbols=1;
+ pucchres2->format.choice.format2->startingSymbolIndex=13;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
+ pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
+ pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
+ NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
+ pucch_Config->format2->choice.setup = pucchfmt2;
+ pucchfmt2->interslotFrequencyHopping=NULL;
+ pucchfmt2->additionalDMRS=NULL;
+ pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
+ *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
+ pucchfmt2->nrofSlots=NULL;
+ pucchfmt2->pi2BPSK=NULL;
+ pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
+ *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
+
+ // PUCCH config - Scheduling request configuration
+ pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
+ NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
+ schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
+ schedulingRequestResourceConfig->schedulingRequestID = 0;
+ schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40; // 40 slot period
+ // note: make sure that there is no issue here. Later choose the RNTI accordingly.
+ // Here we would be limited to 3 UEs on this resource (1 1/2 Frames 30 kHz SCS, 5 ms TDD periodicity => slots 7,8,9).
+ // This should be a temporary resource until the first RRCReconfiguration gives new pucch resources.
+ // Check for above configuration and exit for now if it is not the case
+ AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
+ "SCS != 30kHz\n");
+ AssertFatal(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity==NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5,
+ "TDD period != 5ms : %ld\n",scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8;
+ schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
+ *schedulingRequestResourceConfig->resource = 0;
+ ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
+ pucch_Config->schedulingRequestResourceToReleaseList=NULL;
+
+ pucch_Config->multi_CSI_PUCCH_ResourceList=NULL;
+ pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
+ long *delay[8];
+ for (int i=0;i<8;i++) {
+ delay[i] = calloc(1,sizeof(*delay[i]));
+ AssertFatal(configuration->minRXTXTIME >=2 && configuration->minRXTXTIME <7, "check minRXTXTIME %d\n",configuration->minRXTXTIME);
+ *delay[i] = i+configuration->minRXTXTIME;
+ ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
+ }
+ pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
+ NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
+ pucchspatial->pucch_SpatialRelationInfoId = 1;
+ pucchspatial->servingCellId = NULL;
+ if(configuration->do_CSIRS) {
+ pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+ pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
+ }
+ else {
+ pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
+ pucchspatial->referenceSignal.choice.ssb_Index = 0;
+ }
+ pucchspatial->pucch_PathlossReferenceRS_Id = 0;
+ pucchspatial->p0_PUCCH_Id = 1;
+ pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
+ ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
+ pucch_Config->spatialRelationInfoToReleaseList=NULL;
+ pucch_Config->pucch_PowerControl=calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = 0;
+ pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
+ NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
+ p00->p0_PUCCH_Id=1;
+ p00->p0_PUCCH_Value = 0;
+ ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
+ pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
+
+ // PUSCH config
+ ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+ pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+ *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+ NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+ *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
+ NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ NR_DMRS_UplinkConfig->maxLength=NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+ pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+ pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+ pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+ *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+ pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant));
+ *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -98;
+ pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+ NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+ aset->p0_PUSCH_AlphaSetId=0;
+ aset->p0=calloc(1,sizeof(*aset->p0));
+ *aset->p0 = 0;
+ aset->alpha=calloc(1,sizeof(*aset->alpha));
+ *aset->alpha=NR_Alpha_alpha1;
+ ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList));
+ NR_PUSCH_PathlossReferenceRS_t *plrefRS = calloc(1,sizeof(*plrefRS));
+ plrefRS->pusch_PathlossReferenceRS_Id=0;
+ plrefRS->referenceSignal.present = NR_PUSCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index;
+ plrefRS->referenceSignal.choice.ssb_Index = 0;
+ ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList->list,plrefRS);
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+ pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+ pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList));
+ NR_SRI_PUSCH_PowerControl_t *sriPUSCHPC=calloc(1,sizeof(*sriPUSCHPC));
+ sriPUSCHPC->sri_PUSCH_PowerControlId=0;
+ sriPUSCHPC->sri_PUSCH_PathlossReferenceRS_Id=0;
+ sriPUSCHPC->sri_P0_PUSCH_AlphaSetId=0;
+ sriPUSCHPC->sri_PUSCH_ClosedLoopIndex=NR_SRI_PUSCH_PowerControl__sri_PUSCH_ClosedLoopIndex_i0;
+ ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList->list,sriPUSCHPC);
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+ pusch_Config->frequencyHopping=NULL;
+ pusch_Config->frequencyHoppingOffsetLists=NULL;
+ pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+ pusch_Config->pusch_TimeDomainAllocationList = NULL;
+ pusch_Config->pusch_AggregationFactor=NULL;
+ pusch_Config->mcs_Table=NULL;
+ pusch_Config->mcs_TableTransformPrecoder=NULL;
+ pusch_Config->transformPrecoder= NULL;
+ if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+ pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+ *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
+ }
+ pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+ *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+ pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+ *pusch_Config->maxRank= 1;
+ pusch_Config->rbg_Size=NULL;
+ pusch_Config->uci_OnPUSCH=NULL;
+ pusch_Config->tp_pi2BPSK=NULL;
+ uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
+ if (pusch_Config->transformPrecoder == NULL) {
+ if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
+ transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
+ }
+ else {
+ transform_precoding = *pusch_Config->transformPrecoder;
+ }
+ if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
+ // Enable DMRS uplink config for transform precoding enabled
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
+ LOG_I(NR_RRC,"Transform precoding enabled\n");
+ }
+
+ // SRS config
+ ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
+ ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
+ ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+ NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
+ ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
+ srs_Config->srs_ResourceSetToReleaseList=NULL;
+ srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+ NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
+ srs_resset0->srs_ResourceSetId = 0;
+ srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+ NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
+ *srs_resset0_id=0;
+ ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
+ srs_Config->srs_ResourceToReleaseList=NULL;
+ srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
+ srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
+ srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
+ srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
+ srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
+ *srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
+ srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
+ srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+ srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+ *srs_resset0->alpha = NR_Alpha_alpha1;
+ srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
+ *srs_resset0->p0=-80;
+ srs_resset0->pathlossReferenceRS=NULL;
+ srs_resset0->srs_PowerControlAdjustmentStates=NULL;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+ srs_Config->srs_ResourceToReleaseList=NULL;
+ srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+ NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+ srs_res0->srs_ResourceId=0;
+ srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
+ srs_res0->ptrs_PortIndex=NULL;
+ srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
+ srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+ srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
+ srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
+ srs_res0->resourceMapping.startPosition=2;
+ srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+ srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+ srs_res0->freqDomainPosition=0;
+ srs_res0->freqDomainShift=0;
+ srs_res0->freqHopping.c_SRS=0;
+ srs_res0->freqHopping.b_SRS=0;
+ srs_res0->freqHopping.b_hop=0;
+ srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
+ srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
+ srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
+ srs_res0->sequenceId=40;
+ srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+ srs_res0->spatialRelationInfo->servingCellId=NULL;
+ srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+ srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
+
+ ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
+}
void fill_initial_SpCellConfig(int uid,
NR_SpCellConfig_t *SpCellConfig,
NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration)
{
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
@@ -1029,8 +1560,10 @@ void fill_initial_SpCellConfig(int uid,
SpCellConfig->reconfigurationWithSync = NULL;
SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
SpCellConfig->rlf_TimersAndConstants = NULL;
+
SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated));
SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig));
+
NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config));
@@ -1115,7 +1648,6 @@ void fill_initial_SpCellConfig(int uid,
pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
-
initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
@@ -1268,7 +1800,7 @@ void fill_initial_SpCellConfig(int uid,
pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
- schedulingRequestResourceConfig->schedulingRequestID= 0;
+ schedulingRequestResourceConfig->schedulingRequestID = 0;
schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40;
AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
@@ -1305,6 +1837,7 @@ void fill_initial_SpCellConfig(int uid,
// options are 24, 48 or 96
coreset->frequencyDomainResources.buf = calloc(1,6);
if (0) {
+ int curr_bwp = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
if (curr_bwp < 48)
coreset->frequencyDomainResources.buf[0] = 0xf0;
else
@@ -1349,13 +1882,13 @@ void fill_initial_SpCellConfig(int uid,
ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
ss2->monitoringSymbolsWithinSlot->size = 2;
- ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
ss2->monitoringSymbolsWithinSlot->buf[0]=0x80;
ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+ ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
- ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
+ ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
@@ -1405,7 +1938,7 @@ void fill_initial_SpCellConfig(int uid,
SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig;
if (configuration->do_CSIRS) {
-
+
SpCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->csi_MeasConfig));
SpCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
@@ -1418,7 +1951,7 @@ void fill_initial_SpCellConfig(int uid,
csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList));
csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL;
-
+
NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0));
ssbresset0->csi_SSB_ResourceSetId=0;
@@ -1463,7 +1996,7 @@ void fill_initial_SpCellConfig(int uid,
csires0->bwp_Id = 0;
csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0);
-
+
NR_CSI_ResourceConfig_t *csires1 = calloc(1,sizeof(*csires1));
csires1->csi_ResourceConfigId=1;
@@ -1516,8 +2049,8 @@ void fill_initial_SpCellConfig(int uid,
*csirep1->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
csirep1->reportFreqConfiguration->pmi_FormatIndicator = calloc(1,sizeof(*csirep1->reportFreqConfiguration->pmi_FormatIndicator));
*csirep1->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
- csirep1->reportFreqConfiguration->csi_ReportingBand = NULL;
-/*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand));
+ csirep1->reportFreqConfiguration->csi_ReportingBand = NULL;
+ /*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand));
csirep1->reportFreqConfiguration->csi_ReportingBand->present = NR_CSI_ReportConfig__reportFreqConfiguration__csi_ReportingBand_PR_subbands7;
csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.size=1;
csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.bits_unused=1;
@@ -1597,27 +2130,63 @@ void fill_initial_SpCellConfig(int uid,
pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers));
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2;
+ // Downlink BWPs
+ int n_dl_bwp = 0;
+ if (servingcellconfigdedicated &&
+ servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+ servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count > 0) {
+ n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count;
+ }
+ if(n_dl_bwp>0){
+ SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+ for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
+ NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+ fill_default_downlinkBWP(bwp, bwp_loop, servingcellconfigdedicated, scc, configuration);
+ ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+ }
+ SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
+ *SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1;
+ SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
+ *SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1;
+ }
+
+ // Uplink BWPs
+ int n_ul_bwp = 0;
+ if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig &&
+ servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+ servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 0) {
+ n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+ }
+ if(n_ul_bwp>0) {
+ SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+ for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
+ NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp));
+ fill_default_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, scc, configuration, uid);
+ ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
+ }
+ SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
+ *SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1;
+ }
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)SpCellConfig);
+ }
+
}
-void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb) {
-
- cellGroupConfig->cellGroupId = 0;
- cellGroupConfig->rlc_BearerToReleaseList = NULL;
- cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
-
- // RLC Bearer Config
- // TS38.331 9.2.1 Default SRB configurations
- NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
- NR_RLC_Config_t *rlc_Config = NULL;
- NR_LogicalChannelConfig_t *logicalChannelConfig = NULL;
- long *logicalChannelGroup = NULL;
+NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(long channelId,
+ long priority,
+ e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration)
+{
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
- rlc_BearerConfig->logicalChannelIdentity = 2;
+ rlc_BearerConfig->logicalChannelIdentity = channelId;
rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
- rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 2;
+ rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = channelId;
rlc_BearerConfig->reestablishRLC = NULL;
- rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
+
+ NR_RLC_Config_t *rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
rlc_Config->present = NR_RLC_Config_PR_am;
rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
@@ -1631,12 +2200,14 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
rlc_BearerConfig->rlc_Config = rlc_Config;
- logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+
+ NR_LogicalChannelConfig_t *logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
- logicalChannelConfig->ul_SpecificParameters->priority = 3;
+ logicalChannelConfig->ul_SpecificParameters->priority = priority;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
- logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5;
- logicalChannelGroup = CALLOC(1, sizeof(long));
+ logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = bucketSizeDuration;
+
+ long *logicalChannelGroup = CALLOC(1, sizeof(long));
*logicalChannelGroup = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
@@ -1644,44 +2215,63 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
- ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
- ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
- // DRB Configuration
- NR_RLC_BearerConfig_t *rlc_BearerConfig_drb = NULL;
- NR_RLC_Config_t *rlc_Config_drb = NULL;
- NR_LogicalChannelConfig_t *logicalChannelConfig_drb = NULL;
- long *logicalChannelGroup_drb = NULL;
- rlc_BearerConfig_drb = calloc(1, sizeof(NR_RLC_BearerConfig_t));
- rlc_BearerConfig_drb->logicalChannelIdentity = 4;
- rlc_BearerConfig_drb->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig_drb->servedRadioBearer));
- rlc_BearerConfig_drb->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
- rlc_BearerConfig_drb->servedRadioBearer->choice.drb_Identity = 1;
- rlc_BearerConfig_drb->reestablishRLC = NULL;
- rlc_Config_drb = calloc(1, sizeof(NR_RLC_Config_t));
-
- if (use_rlc_um_for_drb) nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_um_Bi_Directional);
- else nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_am);
-
-
- rlc_BearerConfig_drb->rlc_Config = rlc_Config_drb;
- logicalChannelConfig_drb = calloc(1, sizeof(NR_LogicalChannelConfig_t));
- logicalChannelConfig_drb->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters));
- logicalChannelConfig_drb->ul_SpecificParameters->priority = 13;
- logicalChannelConfig_drb->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
- logicalChannelConfig_drb->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100;
- logicalChannelGroup_drb = CALLOC(1, sizeof(long));
- *logicalChannelGroup_drb = 1;
- logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup_drb;
- logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID));
- *logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = 0;
- logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_Mask = 0;
- logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
- rlc_BearerConfig_drb->mac_LogicalChannelConfig = logicalChannelConfig_drb;
- ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig_drb);
- ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig_drb);
+ return rlc_BearerConfig;
}
+NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR_RLC_Config_PR rlc_conf, long priority)
+{
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
+ rlc_BearerConfig->logicalChannelIdentity = lcChannelId;
+ rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
+ rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
+ rlc_BearerConfig->servedRadioBearer->choice.drb_Identity = drbId;
+ rlc_BearerConfig->reestablishRLC = NULL;
+
+ NR_RLC_Config_t *rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
+ nr_drb_config(rlc_Config, rlc_conf);
+ rlc_BearerConfig->rlc_Config = rlc_Config;
+
+ NR_LogicalChannelConfig_t *logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+ logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
+ logicalChannelConfig->ul_SpecificParameters->priority = priority;
+ logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
+ logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100;
+
+ long *logicalChannelGroup = CALLOC(1, sizeof(long));
+ *logicalChannelGroup = 1;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
+ logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
+ *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
+ rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
+
+ return rlc_BearerConfig;
+}
+
+void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup, int use_rlc_um_for_drb, uint8_t configure_srb, uint8_t bearer_id_start, uint8_t nb_bearers_to_setup, long *priority ) {
+
+ cellGroupConfig->cellGroupId = 0;
+ cellGroupConfig->rlc_BearerToReleaseList = NULL;
+ cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+
+ // RLC Bearer Config
+ // TS38.331 9.2.1 Default SRB configurations
+ if (configure_srb){
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(2, 3, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5);
+ ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ }
+
+ // DRB Configuration
+ for (int i = bearer_id_start; i < bearer_id_start + nb_bearers_to_setup; i++ ){
+ const NR_RLC_Config_PR rlc_conf = use_rlc_um_for_drb ? NR_RLC_Config_PR_um_Bi_Directional : NR_RLC_Config_PR_am;
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = get_DRB_RLC_BearerConfig(3 + i, i, rlc_conf, priority[i-bearer_id_start]);
+ ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ }
+}
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
NR_UE_NR_Capability_t *uecap,
@@ -1690,72 +2280,40 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
if (SpCellConfig == NULL) return;
- NR_ServingCellConfigCommon_t *scc = configuration->scc;
+ NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL;
- NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
- set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
- configuration->force_256qam_off ? NULL : uecap, SpCellConfig,bwp_Dedicated, scc);
-
- struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
- if (DL_BWP_list) {
- for (int i=0; ilist.count; i++){
- NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
- int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
- set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc);
+ // Set DL MCS table
+ if(scc) {
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+ set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
+ configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp_Dedicated, scc);
+ struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
+ if (DL_BWP_list) {
+ for (int i=0; ilist.count; i++){
+ NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
+ int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
+ set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc);
+ }
}
}
-}
+}
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration)
{
- NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
- NR_RLC_Config_t *rlc_Config = NULL;
- NR_LogicalChannelConfig_t *logicalChannelConfig = NULL;
NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
NR_PhysicalCellGroupConfig_t *physicalCellGroupConfig = NULL;
- long *logicalChannelGroup = NULL;
cellGroupConfig->cellGroupId = 0;
/* Rlc Bearer Config */
/* TS38.331 9.2.1 Default SRB configurations */
cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
- rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
- rlc_BearerConfig->logicalChannelIdentity = 1;
- rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
- rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
- rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 1;
- rlc_BearerConfig->reestablishRLC = NULL;
- rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
- rlc_Config->present = NR_RLC_Config_PR_am;
- rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
- rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
- *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
- rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
- rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
- rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
- *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
- rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
- rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
- rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
- rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
- rlc_BearerConfig->rlc_Config = rlc_Config;
- logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
- logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
- logicalChannelConfig->ul_SpecificParameters->priority = 1;
- logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
- logicalChannelGroup = CALLOC(1, sizeof(long));
- *logicalChannelGroup = 0;
- logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
- logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
- *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
- logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
- logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
- rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(1, 1, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000);
ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
cellGroupConfig->rlc_BearerToReleaseList = NULL;
@@ -1801,18 +2359,19 @@ void fill_initial_cellGroupConfig(int uid,
cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
- fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,configuration);
+ fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,servingcellconfigdedicated,configuration);
cellGroupConfig->sCellToAddModList = NULL;
cellGroupConfig->sCellToReleaseList = NULL;
}
//------------------------------------------------------------------------------
-int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
- uint8_t *const buffer,
- const uint8_t transaction_id,
- OCTET_STRING_t *masterCellGroup_from_DU,
- NR_ServingCellConfigCommon_t *scc,
+int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
+ uint8_t *const buffer,
+ const uint8_t transaction_id,
+ OCTET_STRING_t *masterCellGroup_from_DU,
+ NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration)
//------------------------------------------------------------------------------
{
@@ -1874,13 +2433,11 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
&asn_DEF_NR_CellGroupConfig, //might be added prefix later
(void **)&cellGroupConfig,
(uint8_t *)masterCellGroup_from_DU->buf,
- masterCellGroup_from_DU->size, 0, 0);
-
- xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+ masterCellGroup_from_DU->size, 0, 0);
}
else {
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
- fill_initial_cellGroupConfig(ue_context_pP->local_uid, cellGroupConfig, scc, configuration);
+ fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
@@ -1903,8 +2460,10 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
ue_p->masterCellGroup = cellGroupConfig;
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
}
+
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_CCCH_Message,
NULL,
(void *)&dl_ccch_msg,
@@ -1917,7 +2476,7 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
return -1;
}
- LOG_I(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n",
+ LOG_D(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n",
enc_rval.encoded,(enc_rval.encoded+7)/8);
return((enc_rval.encoded+7)/8);
}
@@ -2181,7 +2740,7 @@ int16_t do_RRCReconfiguration(
if(cellGroupConfig!=NULL){
update_cellGroupConfig(cellGroupConfig,
- ue_context_pP->ue_context.UE_Capability_nr,
+ ue_context_pP ? ue_context_pP->ue_context.UE_Capability_nr : NULL,
configuration);
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
@@ -2194,7 +2753,9 @@ int16_t do_RRCReconfiguration(
enc_rval.failed_type->name, enc_rval.encoded);
return -1;
}
- xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
+ }
ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t));
ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf;
@@ -2203,9 +2764,9 @@ int16_t do_RRCReconfiguration(
dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
- //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
- xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
- //}
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
+ }
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
NULL,
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index 81563eb7cd..e79f79493d 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -104,24 +104,33 @@ uint8_t do_RRCReject(uint8_t Mod_id,
void fill_initial_SpCellConfig(int uid,
NR_SpCellConfig_t *SpCellConfig,
NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration);
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration);
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
NR_UE_NR_Capability_t *uecap,
const gNB_RrcConfigurationReq *configuration);
-void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb);
+void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+ NR_CellGroupConfig_t *ue_context_mastercellGroup,
+ int use_rlc_um_for_drb,
+ uint8_t configure_srb,
+ uint8_t bearer_id_start,
+ uint8_t nb_bearers_to_setup,
+ long *priority);
-int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
+int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
uint8_t *const buffer,
const uint8_t transaction_id,
OCTET_STRING_t *masterCellGroup_from_DU,
NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration);
uint8_t do_NR_SecurityModeCommand(
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index ff52fdb1ad..d339ab0780 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -159,7 +159,8 @@ void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
*nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
set_csirs_periodicity(nzpcsi0, uid, nb_slots_per_period);
- nzpcsi0->qcl_InfoPeriodicCSI_RS = NULL;
+ nzpcsi0->qcl_InfoPeriodicCSI_RS = calloc(1,sizeof(*nzpcsi0->qcl_InfoPeriodicCSI_RS));
+ *nzpcsi0->qcl_InfoPeriodicCSI_RS = 0;
ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
}
else {
@@ -306,35 +307,42 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
}
fs_cc->supportedModulationOrderDL = CALLOC(1,sizeof(*fs_cc->supportedModulationOrderDL));
*fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256;
- ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list,
- fs_cc);
+ ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, fs_cc);
}
}
-void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc){
+void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
+ NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
+ int curr_bwp) {
frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
- int curr_bwp = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
+
// coreset duration setting to be improved in the framework of RRC harmonization, potentially using a common function
int len_coreset = 1;
if (curr_bwp < 48)
len_coreset = 2;
- // setting default TDA for DL with
+ // setting default TDA for DL with TDA index 0
struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+ // k0: Slot offset between DCI and its scheduled PDSCH (see TS 38.214 clause 5.1.2.1) When the field is absent the UE applies the value 0.
+ //timedomainresourceallocation->k0 = calloc(1,sizeof(*timedomainresourceallocation->k0));
+ //*timedomainresourceallocation->k0 = 0;
timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset); // basic slot configuration starting in symbol 1 til the end of the slot
- ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
- timedomainresourceallocation);
+ ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation);
+ // setting TDA for CSI-RS symbol with index 1
+ struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation1 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+ timedomainresourceallocation1->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+ timedomainresourceallocation1->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset-1); // 1 symbol CSI-RS
+ ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation1);
if(frame_type==TDD) {
- // TDD
if(scc->tdd_UL_DL_ConfigurationCommon) {
int dl_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols;
if(dl_symb > 1) {
- timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
- timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
- timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation
- ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
- timedomainresourceallocation);
+ // mixed slot TDA with TDA index 2
+ struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation2 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+ timedomainresourceallocation2->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+ timedomainresourceallocation2->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation
+ ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation2);
}
}
}
@@ -346,63 +354,49 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){
//TODO change to accomodate for SRS
frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
- int temp_min_delay = 6; // k2 = 2 or 3 won'r work as well as higher values
- if(frame_type==TDD && scc->tdd_UL_DL_ConfigurationCommon) {
-
- switch (scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity) {
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2p5: // 30kHz SCS
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2: // 60kHz SCS
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1p25: // 60kHz SCS
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1: // 120kHz SCS
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p625: // 120kHz SCS
- case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p5: // 120kHz SCS
- temp_min_delay = 2;
- break;
- }
- }
-
- int k2 = (min_fb_delayuplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+ // UL TDA index 0 is basic slot configuration starting in symbol 0 til the last but one symbol
struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long));
*pusch_timedomainresourceallocation->k2 = k2;
pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
- pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13); // basic slot configuration starting in symbol 0 til the last but one symbol
+ pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13);
ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation);
if(frame_type==TDD) {
-
- // TDD
if(scc->tdd_UL_DL_ConfigurationCommon) {
int ul_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols;
- pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
- pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long));
- *pusch_timedomainresourceallocation->k2 = k2;
- pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
- pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
- ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation);
+ if (ul_symb>1) {
+ // UL TDA index 1 for mixed slot (TDD)
+ pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
+ pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long));
+ *pusch_timedomainresourceallocation->k2 = k2;
+ pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
+ pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
+ ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation);
- // for msg3 in the mixed slot
- int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
- int nb_slots_per_period = ((1<k2 = CALLOC(1,sizeof(long));
- *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu];
- if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay)
- *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period;
- AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n",
- *pusch_timedomainresourceallocation_msg3->k2);
- pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
- pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
- ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3);
+ // UL TDA index 2 for msg3 in the mixed slot (TDD)
+ int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
+ int nb_slots_per_period = ((1<k2 = CALLOC(1,sizeof(long));
+ *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu];
+ if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay)
+ *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period;
+ AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n",
+ *pusch_timedomainresourceallocation_msg3->k2);
+ pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
+ pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
+ ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3);
+ }
}
}
}
-
void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
NR_SpCellConfig_t *SpCellConfig,
NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
@@ -424,7 +418,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
}
AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs);
int bw = get_supported_band_index(scs, band, bw_rb);
- AssertFatal(bw>0,"Supported band corresponding to %d RBs not found\n", bw_rb);
+ AssertFatal(bw>=0,"Supported band corresponding to %d RBs not found\n", bw_rb);
bool supported = false;
if (band>256) {
@@ -459,5 +453,3 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL;
}
-
-
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index 4bc9513bc5..ca6e20512e 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -111,7 +111,9 @@ typedef struct physicalcellgroup_s{
long RNTI_Value[MAX_NUM_CCs];
}physicalcellgroup_t;
-void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc);
+void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
+ NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
+ int curr_bwp);
void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay);
void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_CSI_MeasConfig_t *csi_MeasConfig,
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index f59abb1bb4..89ae9c1d2b 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -132,7 +132,7 @@ typedef enum UE_STATE_NR_e {
#define MAX_MEAS_ID 7
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 512
+#define RRC_BUF_SIZE 1024
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
@@ -217,7 +217,7 @@ typedef struct HANDOVER_INFO_NR_s {
typedef struct {
char Payload[NR_RRC_BUFFER_SIZE_MAX];
char Header[NR_RRC_HEADER_SIZE_MAX];
- int payload_size;
+ uint16_t payload_size;
} NR_RRC_BUFFER;
#define NR_RRC_BUFFER_SIZE sizeof(RRC_BUFFER_NR)
@@ -290,10 +290,10 @@ typedef struct gNB_RRC_UE_s {
NR_DRB_ToReleaseList_t *DRB_Release_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
uint8_t DRB_active[8];
- NR_SRB_INFO SI;
- NR_SRB_INFO Srb0;
- NR_SRB_INFO_TABLE_ENTRY Srb1;
- NR_SRB_INFO_TABLE_ENTRY Srb2;
+ NR_SRB_INFO SI;
+ NR_SRB_INFO Srb0;
+ NR_SRB_INFO_TABLE_ENTRY Srb1;
+ NR_SRB_INFO_TABLE_ENTRY Srb2;
NR_MeasConfig_t *measConfig;
HANDOVER_INFO *handover_info;
NR_MeasResults_t *measResults;
@@ -454,6 +454,7 @@ typedef struct {
NR_BCCH_DL_SCH_Message_t systemInformation; // SIB23
NR_BCCH_DL_SCH_Message_t *siblock1;
NR_ServingCellConfigCommon_t *servingcellconfigcommon;
+ NR_ServingCellConfig_t *servingcellconfig;
NR_PDCCH_ConfigSIB1_t *pdcch_ConfigSIB1;
NR_CellGroupConfig_t *secondaryCellGroup[MAX_NR_RRC_UE_CONTEXTS];
NR_SRB_INFO SI;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index c8fddbecfb..6a320123de 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -47,13 +47,13 @@ void rrc_config_nr_buffer(NR_SRB_INFO* Srb_info,
uint8_t Lchan_type,
uint8_t Role);
-int mac_rrc_nr_data_req(const module_id_t Mod_idP,
- const int CC_id,
- const frame_t frameP,
- const rb_id_t Srb_id,
- const rnti_t rnti,
- const uint8_t Nb_tb,
- uint8_t *const buffer_pP );
+uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
+ const int CC_id,
+ const frame_t frameP,
+ const rb_id_t Srb_id,
+ const rnti_t rnti,
+ const uint8_t Nb_tb,
+ uint8_t *const buffer_pP);
void rrc_gNB_process_SgNBAdditionRequest(
const protocol_ctxt_t *const ctxt_pP,
@@ -167,6 +167,13 @@ int
nr_rrc_mac_remove_ue(module_id_t mod_idP,
rnti_t rntiP);
+int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
+ const frame_t frameP,
+ const sub_frame_t sub_frameP,
+ const rnti_t rntiP,
+ const int dl_bwp_id,
+ const int ul_bwp_id);
+
int8_t nr_mac_rrc_data_ind(
const module_id_t module_idP,
const int CC_id,
@@ -180,6 +187,11 @@ int8_t nr_mac_rrc_data_ind(
const boolean_t brOption
);
+int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP,
+ protocol_ctxt_t *const ctxt_pP,
+ const int dl_bwp_id,
+ const int ul_bwp_id);
+
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
const uint8_t *buffer,
int buffer_length,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index a0706509a7..9c4eba15a7 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -218,6 +218,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc->ngap_id2_ngap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
rrc->configuration = *configuration;
rrc->carrier.servingcellconfigcommon = configuration->scc;
+ rrc->carrier.servingcellconfig = configuration->scd;
nr_rrc_config_ul_tda(configuration->scc,configuration->minRXTXTIME);
/// System Information INIT
pthread_mutex_init(&rrc->cell_info_mutex,NULL);
@@ -335,12 +336,16 @@ rrc_gNB_generate_RRCSetup(
// T_INT(ctxt_pP->rnti));
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
- ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP,
- (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
- rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
- masterCellGroup_from_DU,
- scc,
- &rrc->configuration);
+ NR_ServingCellConfig_t *servingcellconfigdedicated = rrc->configuration.scd;
+ int16_t ret = do_RRCSetup(ue_context_pP,
+ (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+ masterCellGroup_from_DU,
+ scc,servingcellconfigdedicated,&rrc->configuration);
+
+ AssertFatal(ret>0,"Error generating RRCSetup for RRCSetupRequest\n");
+
+ ue_p->Srb0.Tx_buffer.payload_size = ret;
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
(char *)(ue_p->Srb0.Tx_buffer.Payload),
@@ -442,16 +447,20 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
rrc_gNB_ue_context_t *ue_context_pP = NULL;
gNB_RRC_INST *rrc_instance_p = RC.nrrrc[ctxt_pP->module_id];
NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *servingcellconfigdedicated = rrc_instance_p->configuration.scd;
ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, rrc_instance_p, 0);
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
- ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP,
- (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
- rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
- NULL,
- scc,
- &rrc_instance_p->configuration);
+ int16_t ret = do_RRCSetup(ue_context_pP,
+ (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+ NULL,
+ scc,servingcellconfigdedicated,&rrc_instance_p->configuration);
+
+ AssertFatal(ret>0,"Error generating RRCSetup for RRCReestablishmentRequest\n");
+
+ ue_p->Srb0.Tx_buffer.payload_size = ret;
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
(char *)(ue_p->Srb0.Tx_buffer.Payload),
@@ -799,10 +808,16 @@ rrc_gNB_generate_defaultRRCReconfiguration(
}
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
ue_context_pP->ue_context.rnti,
*rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
- NR_RRC_RECONFIGURATION_DELAY_MS);
+ delay_ms);
}
}
@@ -830,6 +845,9 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
int qos_flow_index = 0;
int pdu_sessions_done = 0;
int i;
+ uint8_t drb_id_to_setup_start = 1;
+ uint8_t nb_drb_to_setup = 0;
+ long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
NR_CellGroupConfig_t *cellGroupConfig;
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
@@ -872,6 +890,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
DRB_config = CALLOC(1, sizeof(*DRB_config));
DRB_config->drb_Identity = i+1;
+ if (drb_id_to_setup_start == 1) drb_id_to_setup_start = DRB_config->drb_Identity;
+ nb_drb_to_setup++;
DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
// sdap_Config
@@ -985,8 +1005,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
memset(buffer, 0, sizeof(buffer));
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
- fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup,
- rrc->um_on_default_drb);
+
+ fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup, rrc->um_on_default_drb, (drb_id_to_setup_start < 2) ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer),
xid,
*SRB_configList2,
@@ -1041,10 +1061,16 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
#endif
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
ue_context_pP->ue_context.rnti,
*rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
- NR_RRC_RECONFIGURATION_DELAY_MS);
+ delay_ms);
}
}
@@ -1221,10 +1247,16 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
#endif
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
ue_context_pP->ue_context.rnti,
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
- NR_RRC_RECONFIGURATION_DELAY_MS);
+ delay_ms);
}
}
@@ -1291,8 +1323,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
NULL);
ue_context_pP->ue_context.pdu_session_release_command_flag = 1;
- LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
- "[MSG] RRC Reconfiguration\n");
+
+ LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n");
/* Free all NAS PDUs */
if (nas_length > 0) {
@@ -1328,10 +1360,16 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
#endif
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
ue_context_pP->ue_context.rnti,
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
- NR_RRC_RECONFIGURATION_DELAY_MS);
+ delay_ms);
}
}
@@ -1610,7 +1648,7 @@ rrc_gNB_generate_RRCReestablishment(
ue_context->Srb0.Tx_buffer.payload_size);
#if(0)
/* TODO : It may be needed if gNB goes into full stack working. */
- UE_id = find_nr_UE_id(module_id, rnti);
+ UE = find_nr_UE(module_id, rnti);
if (UE_id != -1) {
/* Activate reject timer, if RRCComplete not received after 10 frames, reject UE */
RC.nrmac[module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1;
@@ -1848,8 +1886,8 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
NULL,
NULL,
NULL);
- LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
- "[MSG] RRC Reconfiguration\n");
+
+ LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n");
/* Free all NAS PDUs */
for (i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) {
@@ -1893,14 +1931,79 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
}
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
ue_context_pP->ue_context.rnti,
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
- NR_RRC_RECONFIGURATION_DELAY_MS);
+ delay_ms);
}
}
//-----------------------------------------------------------------------------
+int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP,
+ protocol_ctxt_t *const ctxt_pP,
+ const int dl_bwp_id,
+ const int ul_bwp_id) {
+
+ uint8_t buffer[RRC_BUF_SIZE];
+ memset(buffer, 0, sizeof(buffer));
+ uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
+
+ NR_CellGroupConfig_t *masterCellGroup = ue_context_pP->ue_context.masterCellGroup;
+ if (dl_bwp_id >= 0) {
+ *masterCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = dl_bwp_id;
+ *masterCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = dl_bwp_id;
+ }
+ if (ul_bwp_id >= 0) {
+ *masterCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = ul_bwp_id;
+ }
+
+ uint16_t size = do_RRCReconfiguration(ctxt_pP,
+ buffer,
+ sizeof(buffer),
+ xid,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ masterCellGroup);
+
+ nr_rrc_data_req(ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+
+ if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+ uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+ ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+ NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
+ nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
+ ue_context_pP->ue_context.rnti,
+ *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
+ delay_ms);
+ }
+
+ return 0;
+}
+
/*------------------------------------------------------------------------------*/
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
const uint8_t *buffer,
@@ -3147,10 +3250,9 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(message_p);
uint32_t incoming_teid = 0;
-
- NR_CellGroupConfig_t *cellGroupConfig;
- cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
- fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup,rrc->um_on_default_drb);
+ uint8_t drb_id_to_setup_start = 0;
+ uint8_t nb_drb_to_setup = 0;
+ long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
/* Configure SRB2 */
NR_SRB_ToAddMod_t *SRB2_config = NULL;
@@ -3179,6 +3281,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
ue_context_p->ue_context.DRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList));
}
DRB_configList = ue_context_p->ue_context.DRB_configList;
+ nb_drb_to_setup = req->drbs_to_be_setup_length;
for (int i=0; idrbs_to_be_setup_length; i++){
DRB_config = CALLOC(1, sizeof(*DRB_config));
DRB_config->drb_Identity = req->drbs_to_be_setup[i].drb_id;
@@ -3188,6 +3291,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
memcpy(addr.buffer, &drb_p.up_ul_tnl[0].tl_address, sizeof(drb_p.up_ul_tnl[0].tl_address));
addr.length=sizeof(drb_p.up_ul_tnl[0].tl_address)*8;
extern instance_t DUuniqInstance;
+ if (!drb_id_to_setup_start) drb_id_to_setup_start = drb_p.drb_id;
incoming_teid=newGtpuCreateTunnel(DUuniqInstance,
req->rnti,
drb_p.drb_id,
@@ -3199,6 +3303,10 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
}
}
+ NR_CellGroupConfig_t *cellGroupConfig;
+ cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup, rrc->um_on_default_drb, SRB2_config ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
+
apply_macrlc_config(rrc, ue_context_p, &ctxt);
/* Fill the UE context setup response ITTI message to send to F1AP */
resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
@@ -3451,6 +3559,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
FILE *fd=NULL;//fopen("nrRRCstats.log","w");
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head)) {
ctxt_pP->rnti = ue_context_p->ue_id_rnti;
+ gNB_MAC_INST *nrmac=RC.nrmac[ctxt_pP->module_id]; //WHAT A BEAUTIFULL RACE CONDITION !!!
if (fd) {
if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) {
@@ -3490,7 +3599,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
// Remove here the MAC and RRC context when RRC is not connected or gNB is not connected to CN5G
if(ue_context_p->ue_context.StatusRrc < NR_RRC_CONNECTED || ue_context_p->ue_context.gNB_ue_ngap_id == 0) {
- mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
+ mac_remove_nr_ue(nrmac, ctxt_pP->rnti);
rrc_rlc_remove_ue(ctxt_pP);
pdcp_remove_UE(ctxt_pP);
@@ -3514,7 +3623,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
ue_context_p->ue_context.rnti);
ue_context_p->ue_context.ue_release_timer_rrc = 0;
- mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
+ mac_remove_nr_ue(nrmac, ctxt_pP->rnti);
rrc_rlc_remove_ue(ctxt_pP);
pdcp_remove_UE(ctxt_pP);
newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rnti);
@@ -3533,7 +3642,6 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
if (fd) fclose(fd);
-
/* send a tick to x2ap */
if (is_x2ap_enabled()){
msg = itti_alloc_new_message(TASK_RRC_ENB, 0, X2AP_SUBFRAME_PROCESS);
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index c73c3d9649..96ec634433 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -905,7 +905,7 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
for (pdusession = 0; pdusession < ue_context_pP->ue_context.setup_pdu_sessions; pdusession++) {
// if (xid == ue_context_pP->ue_context.pdusession[pdusession].xid) {
if (ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_DONE) {
- pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession];
+ pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdu_sessions_done];
tmp->pdusession_id = ue_context_pP->ue_context.pduSession[pdusession].param.pdusession_id;
// tmp->pdusession_id = 1;
tmp->nb_of_qos_flow = ue_context_pP->ue_context.pduSession[pdusession].param.nb_qos;
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index b482637dfd..07a6bd85be 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -106,6 +106,9 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerL
}
LOG_A(NR_RRC, "Successfully decoded UE NR capabilities (NR and MRDC)\n");
+ ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
+ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = rrc->carrier.servingcellconfig;
+ LOG_I(NR_RRC,"Adding new NSA user (%p)\n",ue_context_p);
rrc_add_nsa_user(rrc,ue_context_p, m);
}
@@ -241,6 +244,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
cipher_algo,
NR_SecurityConfig__keyToUse_secondary);
}
+
NR_ServingCellConfig_t *scc = ue_context_p->ue_context.spCellConfig ?
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated : NULL;
fill_default_reconfig(carrier->servingcellconfigcommon,
@@ -250,6 +254,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
ue_context_p->ue_context.UE_Capability_nr,
configuration,
ue_context_p->local_uid);
+
ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
memset((void *)CG_Config,0,sizeof(*CG_Config));
@@ -421,7 +426,8 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
rrc_rlc_remove_ue(&ctxt);
- mac_remove_nr_ue(rrc->module_id, rnti);
+ // WHAT A RACE CONDITION
+ mac_remove_nr_ue(RC.nrmac[rrc->module_id], rnti);
gtpv1u_enb_delete_tunnel_req_t tmp={0};
tmp.rnti=rnti;
tmp.from_gnb=1;
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 3387ad8481..de62035b48 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -50,6 +50,595 @@
#define false 0
#define true 1
+void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) {
+
+ int b = 0;
+ while (b < scd->downlinkBWP_ToAddModList->list.count) {
+ if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+ asn_sequence_del(&scd->downlinkBWP_ToAddModList->list, b, 1);
+ } else {
+ b++;
+ }
+ }
+
+ if(scd->downlinkBWP_ToAddModList->list.count == 0) {
+ free(scd->downlinkBWP_ToAddModList);
+ scd->downlinkBWP_ToAddModList = NULL;
+ }
+
+ b = 0;
+ while (b < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth ==
+ 0) {
+ asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list, b, 1);
+ } else {
+ b++;
+ }
+ }
+
+ if(scd->uplinkConfig->uplinkBWP_ToAddModList->list.count == 0) {
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList);
+ scd->uplinkConfig->uplinkBWP_ToAddModList = NULL;
+ }
+
+}
+
+void fill_default_nsa_downlinkBWP(NR_BWP_Downlink_t *bwp,
+ long bwp_loop,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ const gNB_RrcConfigurationReq *configuration,
+ NR_UE_NR_Capability_t *uecap,
+ int dl_antenna_ports,
+ uint64_t bitmap) {
+
+ /// BWP common configuration
+
+ bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
+
+ if(servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+ bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) {
+ bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+ bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+ bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+ bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+ } else {
+ bwp->bwp_Id=bwp_loop+1;
+ bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+ bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix;
+ }
+
+ bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+ bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
+
+ int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+
+ NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
+ coreset->controlResourceSetId=bwp->bwp_Id+1; // To uniquely identify each Coreset lets derive it from the BWPId
+ // frequency domain resources depends on BWP size
+ // options are 24, 48 or 96
+ coreset->frequencyDomainResources.buf = calloc(1,6);
+ if (curr_bwp < 48)
+ coreset->frequencyDomainResources.buf[0] = 0xf0;
+ else
+ coreset->frequencyDomainResources.buf[0] = 0xff;
+ if (curr_bwp < 96)
+ coreset->frequencyDomainResources.buf[1] = 0;
+ else
+ coreset->frequencyDomainResources.buf[1] = 0xff;
+ coreset->frequencyDomainResources.buf[2] = 0;
+ coreset->frequencyDomainResources.buf[3] = 0;
+ coreset->frequencyDomainResources.buf[4] = 0;
+ coreset->frequencyDomainResources.buf[5] = 0;
+ coreset->frequencyDomainResources.size = 6;
+ coreset->frequencyDomainResources.bits_unused = 3;
+ coreset->duration=1;
+ coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+ coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+ coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
+ NR_TCI_StateId_t *tci[64];
+ for (int i=0;i<64;i++) {
+ if ((bitmap>>(63-i))&0x01){
+ tci[i]=calloc(1,sizeof(*tci[i]));
+ *tci[i] = i;
+ ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
+ }
+ }
+ coreset->tci_StatesPDCCH_ToReleaseList = NULL;
+ coreset->tci_PresentInDCI = NULL;
+ coreset->pdcch_DMRS_ScramblingID = NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
+
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
+
+ NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
+ ss->searchSpaceId = (bwp->bwp_Id<<1)-1; // To uniquely identify each SearchSpace lets derive it from the BWPId
+ ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
+ *ss->controlResourceSetId=coreset->controlResourceSetId;
+ ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
+ ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ ss->duration=NULL;
+ ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
+ ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+ // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
+ ss->monitoringSymbolsWithinSlot->buf[1] = 0;
+ ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6);
+ ss->monitoringSymbolsWithinSlot->size = 2;
+ ss->monitoringSymbolsWithinSlot->bits_unused = 2;
+ ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
+ ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+ ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
+ ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+ ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+ ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+ ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
+ ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
+ ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
+ ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
+ ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
+
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace));
+ *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=ss->searchSpaceId;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
+
+ bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+ bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
+
+ // Prepare PDSCH-TimeDomainResourceAllocation list
+ nr_rrc_config_dl_tda(servingcellconfigcommon,
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+ curr_bwp);
+
+ /// BWP dedicated configuration
+
+ if (!bwp->bwp_Dedicated) {
+ bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+ }
+ bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
+ bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
+
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset);
+
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+
+ NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
+ ss2->searchSpaceId=(bwp->bwp_Id<<1); // To uniquely identify each SearchSpace lets derive it from the BWPId
+ ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
+ *ss2->controlResourceSetId=coreset->controlResourceSetId;
+ ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
+ ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
+ ss2->duration=NULL;
+ ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
+ ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+ ss2->monitoringSymbolsWithinSlot->size = 2;
+ ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
+ ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0;
+ ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+ ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
+ ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+ ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
+ if (curr_bwp < 48)
+ ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+ else if (curr_bwp < 96)
+ ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
+ else
+ ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4;
+ ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+ ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+ ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
+ ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+ ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
+ ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2);
+
+ bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
+
+ if (!bwp->bwp_Dedicated->pdsch_Config) {
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ }
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
+
+ if ((get_softmodem_params()->do_ra || get_softmodem_params()->phy_test) && dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
+ else
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
+ if (!bwp->bwp_Dedicated->pdsch_Config) {
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
+ }
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
+
+ int n_ssb = 0;
+ NR_TCI_State_t *tcid[64];
+ for (int i=0;i<64;i++) {
+ if ((bitmap>>(63-i))&0x01){
+ tcid[i]=calloc(1,sizeof(*tcid[i]));
+ tcid[i]->tci_StateId=n_ssb;
+ tcid[i]->qcl_Type1.cell=NULL;
+ tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id));
+ *tcid[i]->qcl_Type1.bwp_Id=1;
+ tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+ tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i;
+ tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]);
+ n_ssb++;
+ }
+ }
+
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
+ set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing,
+ configuration->force_256qam_off ? NULL : uecap,
+ secondaryCellGroup->spCellConfig,
+ bwp->bwp_Dedicated,
+ servingcellconfigcommon);
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
+ calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL;
+ bwp->bwp_Dedicated->sps_Config = NULL;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL;
+
+#if 0
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig));
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup));
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount));
+ *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer));
+ *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
+#endif
+
+}
+
+void fill_default_nsa_uplinkBWP(NR_BWP_Uplink_t *ubwp,
+ long bwp_loop,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ const gNB_RrcConfigurationReq *configuration,
+ int uid) {
+
+ /// BWP common configuration
+
+ ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
+
+ if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+ bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+ ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+ ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+ ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+ ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+ } else {
+ ubwp->bwp_Id=bwp_loop+1;
+ ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+ ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
+ }
+
+ ubwp->bwp_Common->rach_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon;
+ ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
+ ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
+
+ /// BWP dedicated configuration
+
+ if (!ubwp->bwp_Dedicated) {
+ ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+ }
+ ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
+ ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
+ NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
+ ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
+ pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
+ pucch_Config->resourceSetToReleaseList = NULL;
+ NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0));
+ NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1));
+ pucchresset0->pucch_ResourceSetId = 0;
+ NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0));
+ *pucchresset0id0=1;
+ ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
+ pucchresset0->maxPayloadSize=NULL;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
+
+ pucchresset1->pucch_ResourceSetId = 1;
+ NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0));
+ *pucchresset1id0=2;
+ ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
+ pucchresset1->maxPayloadSize=NULL;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
+
+ pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
+ pucch_Config->resourceToReleaseList = NULL;
+ NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
+ NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
+
+ int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+
+ pucchres0->pucch_ResourceId=1;
+ pucchres0->startingPRB= (8 + uid) % curr_bwp;
+ pucchres0->intraSlotFrequencyHopping=NULL;
+ pucchres0->secondHopPRB=NULL;
+ pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
+ pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
+ pucchres0->format.choice.format0->initialCyclicShift=0;
+ pucchres0->format.choice.format0->nrofSymbols=1;
+ pucchres0->format.choice.format0->startingSymbolIndex=13;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
+
+ pucchres2->pucch_ResourceId=2;
+ pucchres2->startingPRB=0;
+ pucchres2->intraSlotFrequencyHopping=NULL;
+ pucchres2->secondHopPRB=NULL;
+ pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
+ pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
+ pucchres2->format.choice.format2->nrofPRBs=8;
+ pucchres2->format.choice.format2->nrofSymbols=1;
+ pucchres2->format.choice.format2->startingSymbolIndex=13;
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
+
+ pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
+ pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
+ NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
+ pucch_Config->format2->choice.setup = pucchfmt2;
+ pucchfmt2->interslotFrequencyHopping=NULL;
+ pucchfmt2->additionalDMRS=NULL;
+ pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
+ *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
+ pucchfmt2->nrofSlots=NULL;
+ pucchfmt2->pi2BPSK=NULL;
+ pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
+ *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
+
+ // for scheduling requestresource
+ pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
+ NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
+ schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
+ schedulingRequestResourceConfig->schedulingRequestID = 0;
+ schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = 7;
+ schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
+ *schedulingRequestResourceConfig->resource = 1;
+ ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
+
+ pucch_Config->schedulingRequestResourceToReleaseList=NULL;
+ pucch_Config->multi_CSI_PUCCH_ResourceList=NULL;
+ pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
+ long *delay[8];
+ for (int i=0;i<8;i++) {
+ delay[i] = calloc(1,sizeof(*delay[i]));
+ *delay[i] = i + configuration->minRXTXTIME;
+ ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
+ }
+ pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
+ NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
+ pucchspatial->pucch_SpatialRelationInfoId = 1;
+ pucchspatial->servingCellId = NULL;
+ if(configuration->do_CSIRS) {
+ pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+ pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
+ }
+ else {
+ pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
+ pucchspatial->referenceSignal.choice.ssb_Index = 0;
+ }
+ pucchspatial->pucch_PathlossReferenceRS_Id = 0;
+ pucchspatial->p0_PUCCH_Id = 1;
+ pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
+ ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
+ pucch_Config->spatialRelationInfoToReleaseList=NULL;
+ pucch_Config->pucch_PowerControl=calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = 0;
+ pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = 0;
+ pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
+ NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
+ p00->p0_PUCCH_Id=1;
+ p00->p0_PUCCH_Value = 0;
+ ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
+ pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
+
+ ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+ bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+ pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Dedicated->pusch_Config->choice.setup;
+ } else {
+ pusch_Config = calloc(1,sizeof(*pusch_Config));
+ }
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+ pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+ *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+ if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) {
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ }
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+ NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+ *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
+ if (!servingcellconfigdedicated) {
+ NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ }
+ NR_DMRS_UplinkConfig->maxLength=NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+ pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+ pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+ pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+ *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+ pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
+ pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+ NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+ aset->p0_PUSCH_AlphaSetId=0;
+ aset->p0=calloc(1,sizeof(*aset->p0));
+ *aset->p0 = 0;
+ aset->alpha=calloc(1,sizeof(*aset->alpha));
+ *aset->alpha=NR_Alpha_alpha1;
+ ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+ pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+ pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+ pusch_Config->frequencyHopping=NULL;
+ pusch_Config->frequencyHoppingOffsetLists=NULL;
+ pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+ pusch_Config->pusch_TimeDomainAllocationList = NULL;
+ pusch_Config->pusch_AggregationFactor=NULL;
+ pusch_Config->mcs_Table=NULL;
+ pusch_Config->transformPrecoder= NULL;
+ pusch_Config->mcs_TableTransformPrecoder=NULL;
+ /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
+ if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+ pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+ *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
+ }
+ pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+ *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+ pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+ *pusch_Config->maxRank= 1;
+ pusch_Config->rbg_Size=NULL;
+ pusch_Config->uci_OnPUSCH=NULL;
+ pusch_Config->tp_pi2BPSK=NULL;
+
+ ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
+ ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+ NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
+ ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
+ srs_Config->srs_ResourceSetToReleaseList=NULL;
+ srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+ NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
+ srs_resset0->srs_ResourceSetId = 0;
+ srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+ NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
+ *srs_resset0_id=0;
+ ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
+ srs_Config->srs_ResourceToReleaseList=NULL;
+
+ if(configuration->do_SRS) {
+ srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic;
+ srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
+ srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
+ } else {
+ srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
+ srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
+ srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
+ srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
+ srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
+ *srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
+ srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
+ }
+
+ srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+ srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+ *srs_resset0->alpha = NR_Alpha_alpha1;
+ srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
+ *srs_resset0->p0=-80;
+ srs_resset0->pathlossReferenceRS=NULL;
+ srs_resset0->srs_PowerControlAdjustmentStates=NULL;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+ srs_Config->srs_ResourceToReleaseList=NULL;
+ srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+ NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+ srs_res0->srs_ResourceId=0;
+ srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
+ srs_res0->ptrs_PortIndex=NULL;
+ srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
+ srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+ srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
+ srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
+ srs_res0->resourceMapping.startPosition = 2 + uid%2;
+ srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+ srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+ srs_res0->freqDomainPosition=0;
+ srs_res0->freqDomainShift=0;
+ srs_res0->freqHopping.b_SRS=0;
+ srs_res0->freqHopping.b_hop=0;
+ srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
+ NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
+ srs_res0->freqHopping.b_SRS);
+ srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
+
+ if(configuration->do_SRS) {
+ srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
+ srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
+ srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
+ srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
+ } else {
+ srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
+ srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
+ }
+
+ srs_res0->sequenceId=40;
+ srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+ srs_res0->spatialRelationInfo->servingCellId=NULL;
+ srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+ srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
+
+ ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
+ ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
+
+}
+
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
@@ -57,8 +646,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
int scg_id,
int servCellIndex,
const gNB_RrcConfigurationReq *configuration,
- int uid)
-{
+ int uid) {
+
const rrc_pdsch_AntennaPorts_t* pdschap = &configuration->pdsch_AntennaPorts;
const int dl_antenna_ports = pdschap->N1 * pdschap->N2 * pdschap->XP;
const int do_csirs = configuration->do_CSIRS;
@@ -74,6 +663,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
+ fix_servingcellconfigdedicated(servingcellconfigdedicated);
+
uint64_t bitmap=0;
switch (servingcellconfigcommon->ssb_PositionsInBurst->present) {
case 1 :
@@ -198,12 +789,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000;
secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
- if (servingcellconfigdedicated) {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated = servingcellconfigdedicated;
- } else {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
- }
+
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
+
+ /// initialDownlinkBWP
+
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config));
@@ -225,7 +816,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
-
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList));
int n_ssb = 0;
@@ -245,7 +835,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
}
}
-
#if 0
NR_TCI_State_t*tci0=calloc(1,sizeof(*tci0));
@@ -371,406 +960,129 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
#endif
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
-
- NR_BWP_Downlink_t *bwp = NULL;
- if (servingcellconfigdedicated) {
- bwp=servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[0];
- } else {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+ /// initialUplinkBWP
- bwp=calloc(1,sizeof(*bwp));
- }
- bwp->bwp_Id=1;
- bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common));
- // copy common BWP size from initial BWP except for bandwdith
- memcpy((void*)&bwp->bwp_Common->genericParameters,
- &servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters,
- sizeof(bwp->bwp_Common->genericParameters));
- bwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ if (!secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+ }
-
- bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
- bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
+ NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
+ initialUplinkBWP->pucch_Config = NULL;
+ initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
+ initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
-
- NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
- coreset->controlResourceSetId=1;
- // frequency domain resources depends on BWP size
- // options are 24, 48 or 96
- coreset->frequencyDomainResources.buf = calloc(1,6);
- if (curr_bwp < 48)
- coreset->frequencyDomainResources.buf[0] = 0xf0;
- else
- coreset->frequencyDomainResources.buf[0] = 0xff;
- if (curr_bwp < 96)
- coreset->frequencyDomainResources.buf[1] = 0;
- else
- coreset->frequencyDomainResources.buf[1] = 0xff;
- coreset->frequencyDomainResources.buf[2] = 0;
- coreset->frequencyDomainResources.buf[3] = 0;
- coreset->frequencyDomainResources.buf[4] = 0;
- coreset->frequencyDomainResources.buf[5] = 0;
- coreset->frequencyDomainResources.size = 6;
- coreset->frequencyDomainResources.bits_unused = 3;
- coreset->duration=1;
- coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
- coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-
- coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
- NR_TCI_StateId_t *tci[64];
- for (int i=0;i<64;i++) {
- if ((bitmap>>(63-i))&0x01){
- tci[i]=calloc(1,sizeof(*tci[i]));
- *tci[i] = i;
- ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
- }
- }
- coreset->tci_StatesPDCCH_ToReleaseList = NULL;
- coreset->tci_PresentInDCI = NULL;
- coreset->pdcch_DMRS_ScramblingID = NULL;
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
-
- NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
- ss->searchSpaceId = 1;
- ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
- *ss->controlResourceSetId=1;
- ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
- ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
- ss->duration=NULL;
- ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
- ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
- // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
- ss->monitoringSymbolsWithinSlot->buf[1] = 0;
- ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6);
- ss->monitoringSymbolsWithinSlot->size = 2;
- ss->monitoringSymbolsWithinSlot->bits_unused = 2;
- ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
- ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
- ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
- ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
- ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
- ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
- ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
- ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
- ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
- ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
- if(get_softmodem_params()->sa) {
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
- *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0;
- }
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace));
- *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=1;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
-
- bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
- bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
-
- // copy PDSCH TimeDomainResourceAllocation from InitialBWP
-
- NR_PDSCH_TimeDomainResourceAllocation_t *pdschi;
- for (int i=0;idownlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count;i++) {
- pdschi= calloc(1,sizeof(*pdschi));
- if(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0){
- pdschi->k0 = calloc(1,sizeof(*pdschi->k0));
- *pdschi->k0 = *servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0;
- }
- pdschi->mappingType = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->mappingType;
- pdschi->startSymbolAndLength = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
- ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,pdschi);
- }
-
- if (!servingcellconfigdedicated) {
- bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
- }
- bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
- bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
- bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list,
- coreset);
-
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
-
- NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
-
- ss2->searchSpaceId=2;
- ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
- *ss2->controlResourceSetId=1;
- ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
- ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
- ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
- ss2->duration=NULL;
- ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
- ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
- ss2->monitoringSymbolsWithinSlot->size = 2;
- ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
- ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0;
- ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
- ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
- ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
- ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
- if (curr_bwp < 48)
- ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
- else if (curr_bwp < 96)
- ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
- else
- ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4;
- ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
- ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
- ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
- ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
- ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list,
- ss2);
-
-
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
-
- if (!servingcellconfigdedicated) {
- bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
-
- bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
-
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
- }
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
-
- if ((get_softmodem_params()->do_ra ||
- get_softmodem_params()->phy_test) &&
- dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
- else
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
- if (!servingcellconfigdedicated) {
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
- }
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
-
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-
- n_ssb = 0;
- NR_TCI_State_t *tcid[64];
- for (int i=0;i<64;i++) {
- if ((bitmap>>(63-i))&0x01){
- tcid[i]=calloc(1,sizeof(*tcid[i]));
- tcid[i]->tci_StateId=n_ssb;
- tcid[i]->qcl_Type1.cell=NULL;
- tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id));
- *tcid[i]->qcl_Type1.bwp_Id=1;
- tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i;
- tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]);
- n_ssb++;
- }
- }
-
-
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
- set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing,
- configuration->force_256qam_off ? NULL : uecap,
- secondaryCellGroup->spCellConfig,bwp->bwp_Dedicated,
- servingcellconfigcommon);
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
- calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL;
- bwp->bwp_Dedicated->sps_Config = NULL; //calloc(1,sizeof(struct NR_SetupRelease_SPS_Config));
-
- bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL;
-#if 0
- bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig));
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup;
-
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup));
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount));
- *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer));
- *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
-#endif
-
- if (!servingcellconfigdedicated) {
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
- }
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
-
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=1;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = 1;
-
- if (!servingcellconfigdedicated) {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
- }
-
- NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
- initialUplinkBWP->pucch_Config = NULL;
- initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
- initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- NR_PUSCH_Config_t *pusch_Config = NULL;
- if (servingcellconfigdedicated) {
- pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
- } else {
- pusch_Config = calloc(1,sizeof(*pusch_Config));
- }
- initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
- pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
- *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
- if (!servingcellconfigdedicated) {
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
- }
- NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
- NR_DMRS_UplinkConfig->dmrs_Type = NULL;
- NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
- *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
- if (!servingcellconfigdedicated) {
- NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
- }
- NR_DMRS_UplinkConfig->maxLength=NULL;
- NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
- NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
- pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
- pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
- pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
- *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
- pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
- pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
- NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
- aset->p0_PUSCH_AlphaSetId=0;
- aset->p0=calloc(1,sizeof(*aset->p0));
- *aset->p0 = 0;
- aset->alpha=calloc(1,sizeof(*aset->alpha));
- *aset->alpha=NR_Alpha_alpha1;
- ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
- pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
- pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
- pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
- pusch_Config->pusch_PowerControl->deltaMCS = NULL;
- pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
- pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
- pusch_Config->frequencyHopping=NULL;
- pusch_Config->frequencyHoppingOffsetLists=NULL;
- pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
- pusch_Config->pusch_TimeDomainAllocationList = NULL;
- pusch_Config->pusch_AggregationFactor=NULL;
- pusch_Config->mcs_Table=NULL;
- pusch_Config->transformPrecoder= NULL;
- pusch_Config->mcs_TableTransformPrecoder=NULL;
- /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
- if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ if (servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+ pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
+ } else {
+ pusch_Config = calloc(1,sizeof(*pusch_Config));
+ }
+ initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
+ pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+ *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+ if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) {
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ }
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+ NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+ *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
+ if (!servingcellconfigdedicated) {
+ NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ }
+ NR_DMRS_UplinkConfig->maxLength=NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+ pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+ pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+ pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+ *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+ pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
+ pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+ NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+ aset->p0_PUSCH_AlphaSetId=0;
+ aset->p0=calloc(1,sizeof(*aset->p0));
+ *aset->p0 = 0;
+ aset->alpha=calloc(1,sizeof(*aset->alpha));
+ *aset->alpha=NR_Alpha_alpha1;
+ ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+ pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+ pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
+ pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+ pusch_Config->frequencyHopping=NULL;
+ pusch_Config->frequencyHoppingOffsetLists=NULL;
+ pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+ pusch_Config->pusch_TimeDomainAllocationList = NULL;
+ pusch_Config->pusch_AggregationFactor=NULL;
+ pusch_Config->mcs_Table=NULL;
+ pusch_Config->transformPrecoder= NULL;
+ pusch_Config->mcs_TableTransformPrecoder=NULL;
+ /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
+ if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
*pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
- }
- pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
- *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
- pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
- *pusch_Config->maxRank= 1;
- pusch_Config->rbg_Size=NULL;
- pusch_Config->uci_OnPUSCH=NULL;
- pusch_Config->tp_pi2BPSK=NULL;
+ }
+ pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+ *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+ pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+ *pusch_Config->maxRank= configuration->pusch_AntennaPorts;
+ pusch_Config->rbg_Size=NULL;
+ pusch_Config->uci_OnPUSCH=NULL;
+ pusch_Config->tp_pi2BPSK=NULL;
- /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
+ /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
- uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
+ uint8_t transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
- // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
- // Enable this to test transform precoding enabled from dedicated config.
- /*if (pusch_Config->transformPrecoder == NULL)
- pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+ // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
+ // Enable this to test transform precoding enabled from dedicated config.
+ /*if (pusch_Config->transformPrecoder == NULL)
+ pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
- *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled; */
+ *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled; */
// END -------
- if (pusch_Config->transformPrecoder == NULL) {
- if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
- transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
- }
- else
- transform_precoding = *pusch_Config->transformPrecoder;
+ if (pusch_Config->transformPrecoder == NULL) {
+ if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
+ transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
+ }
+ else
+ transformPrecoder = *pusch_Config->transformPrecoder;
- if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
+ if (transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled ) {
/* Enable DMRS uplink config for transform precoding enabled */
NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
-
LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
-
}
- /*----------------------------------------------------------------------------------------------------------------------------*/
- initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
- initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
- NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
- initialUplinkBWP->srs_Config->choice.setup=srs_Config;
- srs_Config->srs_ResourceSetToReleaseList=NULL;
- srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
- NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
- srs_resset0->srs_ResourceSetId = 0;
- srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
- NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
- *srs_resset0_id=0;
- ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
- srs_Config->srs_ResourceToReleaseList=NULL;
+ initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
+ initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+
+ NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
+ initialUplinkBWP->srs_Config->choice.setup=srs_Config;
+ srs_Config->srs_ResourceSetToReleaseList=NULL;
+ srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+ NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
+ srs_resset0->srs_ResourceSetId = 0;
+ srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+ NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
+ *srs_resset0_id=0;
+ ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
+ srs_Config->srs_ResourceToReleaseList=NULL;
if (configuration->do_SRS) {
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic;
@@ -786,35 +1098,35 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
}
- srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
- srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
- *srs_resset0->alpha = NR_Alpha_alpha1;
- srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
- *srs_resset0->p0=-80;
- srs_resset0->pathlossReferenceRS=NULL;
- srs_resset0->srs_PowerControlAdjustmentStates=NULL;
- ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
- srs_Config->srs_ResourceToReleaseList=NULL;
- srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
- NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
- srs_res0->srs_ResourceId=0;
- srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
- srs_res0->ptrs_PortIndex=NULL;
- srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
- srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
- srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
- srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
- srs_res0->resourceMapping.startPosition = 2 + uid%2;
- srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
- srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
- srs_res0->freqDomainPosition=0;
- srs_res0->freqDomainShift=0;
- srs_res0->freqHopping.b_SRS=0;
- srs_res0->freqHopping.b_hop=0;
- srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
- NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
- srs_res0->freqHopping.b_SRS);
- srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
+ srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+ srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+ *srs_resset0->alpha = NR_Alpha_alpha1;
+ srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
+ *srs_resset0->p0=-80;
+ srs_resset0->pathlossReferenceRS=NULL;
+ srs_resset0->srs_PowerControlAdjustmentStates=NULL;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+ srs_Config->srs_ResourceToReleaseList=NULL;
+ srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+ NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+ srs_res0->srs_ResourceId=0;
+ srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
+ srs_res0->ptrs_PortIndex=NULL;
+ srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
+ srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+ srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
+ srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
+ srs_res0->resourceMapping.startPosition = 2 + uid%2;
+ srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+ srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+ srs_res0->freqDomainPosition=0;
+ srs_res0->freqDomainShift=0;
+ srs_res0->freqHopping.b_SRS=0;
+ srs_res0->freqHopping.b_hop=0;
+ srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
+ NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
+ srs_res0->freqHopping.b_SRS);
+ srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
if (configuration->do_SRS) {
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
@@ -826,174 +1138,52 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
}
- srs_res0->sequenceId=40;
- srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
- srs_res0->spatialRelationInfo->servingCellId=NULL;
- srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
- srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
- ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
+ srs_res0->sequenceId=40;
+ srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+ srs_res0->spatialRelationInfo->servingCellId=NULL;
+ srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+ srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
+ ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
- NR_BWP_Uplink_t *ubwp = NULL;
- if (servingcellconfigdedicated) {
- ubwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
- } else {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
- ubwp = calloc(1,sizeof(*ubwp));
- }
- ubwp->bwp_Id=1;
- ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
- // copy bwp_Common from Initial UL BWP except for bandwidth
- memcpy((void*)&ubwp->bwp_Common->genericParameters,
- (void*)&servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters,
- sizeof(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters));
- ubwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+ /// Dedicated BWPs
- ubwp->bwp_Common->rach_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon;
- ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
- ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
-
- if (!servingcellconfigdedicated) {
- ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
- }
- ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
- ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
- NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
- ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
- pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
- pucch_Config->resourceSetToReleaseList = NULL;
- NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0));
- NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1));
- pucchresset0->pucch_ResourceSetId = 0;
- NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0));
- *pucchresset0id0=1;
- ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
- pucchresset0->maxPayloadSize=NULL;
+ // Downlink BWPs
+ int n_dl_bwp = 1;
+ if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList) {
+ n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count;
+ }
+ if(n_dl_bwp>0) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+ for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
+ NR_BWP_Downlink_t *bwp = calloc(1,sizeof(*bwp));
+ fill_default_nsa_downlinkBWP(bwp, bwp_loop, secondaryCellGroup, servingcellconfigdedicated, servingcellconfigcommon, configuration, uecap, dl_antenna_ports, bitmap);
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+ }
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
+ *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
+ *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1;
+ }
- ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
+ // Uplink BWPs
+ int n_ul_bwp = 1;
+ if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+ n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+ }
+ if(n_ul_bwp>0) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+ for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
+ NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp));
+ fill_default_nsa_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, servingcellconfigcommon, configuration, uid);
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+ }
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
+ *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1;
+ }
- pucchresset1->pucch_ResourceSetId = 1;
- NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0));
- *pucchresset1id0=2;
- ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
- pucchresset1->maxPayloadSize=NULL;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
-
- pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
- pucch_Config->resourceToReleaseList = NULL;
- NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
- NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
-
- pucchres0->pucch_ResourceId=1;
- pucchres0->startingPRB= (8 + uid) % curr_bwp;
- pucchres0->intraSlotFrequencyHopping=NULL;
- pucchres0->secondHopPRB=NULL;
- pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
- pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
- pucchres0->format.choice.format0->initialCyclicShift=0;
- pucchres0->format.choice.format0->nrofSymbols=1;
- pucchres0->format.choice.format0->startingSymbolIndex=13;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
-
- pucchres2->pucch_ResourceId=2;
- pucchres2->startingPRB=0;
- pucchres2->intraSlotFrequencyHopping=NULL;
- pucchres2->secondHopPRB=NULL;
- pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
- pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
- pucchres2->format.choice.format2->nrofPRBs=8;
- pucchres2->format.choice.format2->nrofSymbols=1;
- pucchres2->format.choice.format2->startingSymbolIndex=13;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
-
- pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
- pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
- NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
- pucch_Config->format2->choice.setup = pucchfmt2;
- pucchfmt2->interslotFrequencyHopping=NULL;
- pucchfmt2->additionalDMRS=NULL;
- pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
- *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
- pucchfmt2->nrofSlots=NULL;
- pucchfmt2->pi2BPSK=NULL;
- pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
- *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
-
- // for scheduling requestresource
- pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
- NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
- schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
- schedulingRequestResourceConfig->schedulingRequestID = 0;
- schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
- schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10;
- schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = 7;
- schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
- *schedulingRequestResourceConfig->resource = 1;
- ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
-
- pucch_Config->schedulingRequestResourceToReleaseList=NULL;
- pucch_Config->multi_CSI_PUCCH_ResourceList=NULL;
- pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
- long *delay[8];
- for (int i=0;i<8;i++) {
- delay[i] = calloc(1,sizeof(*delay[i]));
- *delay[i] = i + configuration->minRXTXTIME;
- ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
- }
- pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
- NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
- pucchspatial->pucch_SpatialRelationInfoId = 1;
- pucchspatial->servingCellId = NULL;
- if(do_csirs) {
- pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
- pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
- }
- else {
- pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
- pucchspatial->referenceSignal.choice.ssb_Index = 0;
- }
- pucchspatial->pucch_PathlossReferenceRS_Id = 0;
- pucchspatial->p0_PUCCH_Id = 1;
- pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
- ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
- pucch_Config->spatialRelationInfoToReleaseList=NULL;
- pucch_Config->pucch_PowerControl=calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = 0;
- pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
- NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
- p00->p0_PUCCH_Id=1;
- p00->p0_PUCCH_Value = 0;
- ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
- pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
-
- if (!servingcellconfigdedicated) {
- // copy pusch_Config from dedicated initialBWP
- ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
- ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
- }
- ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
- ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
- ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
- ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
-
- ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
-
- if (!servingcellconfigdedicated) {
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
- }
-
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = 1;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig));
NR_PUSCH_ServingCellConfig_t *pusch_scc = calloc(1,sizeof(*pusch_scc));
@@ -1008,9 +1198,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
pusch_scc->ext1->processingType2Enabled = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching = NULL;
-
secondaryCellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink=NULL;
-
secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdcch_ServingCellConfig=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig));
@@ -1034,6 +1222,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
+ int curr_bwp = NRRIV2BW(PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0),275);
config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs);
config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig);
@@ -1237,10 +1426,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP;
csirep2->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0;
- csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration));
- csirep2->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
- csirep2->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
- csirep2->reportFreqConfiguration->csi_ReportingBand=NULL;
+ csirep2->reportFreqConfiguration = NULL;
csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
csirep2->codebookConfig= NULL;
@@ -1264,8 +1450,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
-}
+ *servingcellconfigdedicated = *secondaryCellGroup->spCellConfig->spCellConfigDedicated;
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)secondaryCellGroup->spCellConfig);
+ }
+}
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_ServingCellConfig_t *servingcellconfigdedicated,
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 7dca9b2774..50ec32772d 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -1340,13 +1340,6 @@ static void rrc_ue_generate_RRCSetupComplete(
uint8_t size;
const char *nas_msg;
int nas_msg_length;
- NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig)
- AssertFatal(1==0,"2 > csi_MeasConfig is not null\n");
if (AMF_MODE_ENABLED) {
#if defined(ITTI_SIM)
@@ -1462,8 +1455,8 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
nr_rrc_ue_process_RadioBearerConfig(ctxt_pP,
gNB_index,
&dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig);
- nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED);
- nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED);
+ nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED_NR);
+ nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED_NR);
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
rrc_ue_generate_RRCSetupComplete(
ctxt_pP,
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
index c5d1c1d6fe..79532748d2 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
@@ -450,7 +450,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) {
if(sdap_entity == NULL)
return NULL;
- while(sdap_entity->rnti != rnti && sdap_entity->next_entity != NULL) {
+ while(( sdap_entity->rnti != rnti || sdap_entity->pdusession_id != pdusession_id ) && sdap_entity->next_entity != NULL) {
sdap_entity = sdap_entity->next_entity;
}
@@ -460,6 +460,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) {
return NULL;
}
+
void delete_nr_sdap_entity(uint16_t rnti) {
nr_sdap_entity_t *entityPtr, *entityPrev = NULL;
entityPtr = sdap_info.sdap_entity_llist;
diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h
index ae6a3eb2a6..d08790a058 100644
--- a/openair2/UTIL/OPT/opt.h
+++ b/openair2/UTIL/OPT/opt.h
@@ -109,11 +109,14 @@ typedef enum radio_type_e {
extern int opt_enabled;
#define trace_pdu(x...) if (opt_enabled) trace_pdu_implementation(0, x)
-#define trace_NRpdu(x...) if (opt_enabled) trace_pdu_implementation(1, x)
+#define trace_NRpdu(x...) if (opt_enabled) nr_trace_pdu_implementation(1, x)
void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe,
int oob_event, int oob_event_value);
+void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+ int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe,
+ int oob_event, int oob_event_value);
int init_opt(void);
diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c
index 8731eb294a..9359c48e95 100644
--- a/openair2/UTIL/OPT/probe.c
+++ b/openair2/UTIL/OPT/probe.c
@@ -476,6 +476,14 @@ static void SendFrameNR(guint8 radioType, guint8 direction, guint8 rntiType,
extern RAN_CONTEXT_t RC;
#include
/* Remote serveraddress (where Wireshark is running) */
+void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+ int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event,
+ int oob_event_value) {
+ trace_pdu_implementation(nr, direction, pdu_buffer, pdu_buffer_size,
+ rnti, rntiType, rnti, sysFrameNumber, subFrameNumber, oob_event,
+ oob_event_value);
+}
+
void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event,
int oob_event_value) {
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index 7b8ba308bf..9537f9e18a 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -462,7 +462,7 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
auto inst=&globGtp.instances[instance];
auto it=inst->ue2te_mapping.find(rnti);
- if ( it != inst->ue2te_mapping.end() ) {
+ if ( it != inst->ue2te_mapping.end() && it->second.bearers.find(outgoing_bearer_id) != it->second.bearers.end()) {
LOG_W(GTPU,"[%ld] Create a config for a already existing GTP tunnel (rnti %x)\n", instance, rnti);
inst->ue2te_mapping.erase(it);
}
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 95e5e3ed03..78acc373ee 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -188,6 +188,7 @@ typedef struct {
//! \brief Center frequency in Hz for TX.
//! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
double tx_freq[4];
+ double tune_offset;
//! \brief memory
//! \brief Pointer to Calibration table for RX gains
rx_gain_calib_table_t *rx_gain_calib_table;
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 731129b1d9..8976284345 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -644,6 +644,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
break;
case USRP_X300_DEV:
case USRP_N300_DEV:
+ case USRP_X400_DEV:
rxshift=2;
break;
default:
@@ -746,8 +747,12 @@ static bool is_equal(double a, double b) {
void *freq_thread(void *arg) {
openair0_device *device=(openair0_device *)arg;
usrp_state_t *s = (usrp_state_t *)device->priv;
- s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
- s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+ uhd::tune_request_t tx_tune_req(device->openair0_cfg[0].tx_freq[0],
+ device->openair0_cfg[0].tune_offset);
+ uhd::tune_request_t rx_tune_req(device->openair0_cfg[0].rx_freq[0],
+ device->openair0_cfg[0].tune_offset);
+ s->usrp->set_tx_freq(tx_tune_req);
+ s->usrp->set_rx_freq(rx_tune_req);
return NULL;
}
/*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread
@@ -759,14 +764,18 @@ void *freq_thread(void *arg) {
int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dont_block) {
usrp_state_t *s = (usrp_state_t *)device->priv;
pthread_t f_thread;
- printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
+ printf("Setting USRP TX Freq %f, RX Freq %f, tune_offset: %f, dont_block: %d\n",
+ openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0],
+ openair0_cfg[0].tune_offset, dont_block);
// spawn a thread to handle the frequency change to not block the calling thread
if (dont_block == 1)
pthread_create(&f_thread,NULL,freq_thread,(void *)device);
else {
- s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
- s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+ uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[0], openair0_cfg[0].tune_offset);
+ uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset);
+ s->usrp->set_tx_freq(tx_tune_req);
+ s->usrp->set_rx_freq(rx_tune_req);
}
return(0);
@@ -779,9 +788,11 @@ int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg,
*/
int openair0_set_rx_frequencies(openair0_device *device, openair0_config_t *openair0_cfg) {
usrp_state_t *s = (usrp_state_t *)device->priv;
- uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]);
- rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0];
+ uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset);
+ printf("In openair0_set_rx_frequencies, freq: %f, tune offset: %f\n",
+ openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset);
+ //rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
+ //rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0];
s->usrp->set_rx_freq(rx_tune_req);
return(0);
}
@@ -1276,7 +1287,9 @@ extern "C" {
for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) {
if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i+choffset);
- s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i+choffset);
+ uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[i],
+ openair0_cfg[0].tune_offset);
+ s->usrp->set_rx_freq(rx_tune_req, i+choffset);
set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust);
::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i+choffset);
// limit to maximum gain
@@ -1302,7 +1315,9 @@ extern "C" {
if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i+choffset);
- s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i+choffset);
+ uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[i],
+ openair0_cfg[0].tune_offset);
+ s->usrp->set_tx_freq(tx_tune_req, i+choffset);
s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i+choffset);
LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
}
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index bc9882b4bd..127b2975d5 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -429,6 +429,8 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp
if (!alreadyLocked)
pthread_mutex_lock(&Sockmutex);
+ LOG_D(HW,"sending %d samples at time: %ld, nbAnt %d\n", nsamps, timestamp, nbAnt);
+
for (int i=0; ibuf[i];
@@ -621,7 +623,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
}
rfsimulator_state_t *t = device->priv;
- LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld\n", nsamps, t->nextRxTstamp+nsamps);
+ LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld, nbAnt %d\n", nsamps, t->nextRxTstamp+nsamps, nbAnt);
// deliver data from received data
// check if a UE is connected
int first_sock;
@@ -693,15 +695,16 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
t->poll_telnetcmdq(t->telnetcmd_qid,t);
for (int a=0; achannel_model != NULL ) // apply a channel model
- rxAddInput( ptr->circularBuf, (c16_t *) samplesVoid[a],
- a,
- ptr->channel_model,
- nsamps,
- t->nextRxTstamp,
- CirSize
- );
+ if ( ptr->channel_model != NULL ) { // apply a channel model
+ rxAddInput(ptr->circularBuf, (c16_t *) samplesVoid[a],
+ a,
+ ptr->channel_model,
+ nsamps,
+ t->nextRxTstamp,
+ CirSize);
+ }
else { // no channel modeling
+
double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0
{0.2, 1.0, 0.2, 0.1}, //rx 1
{0.1, 0.2, 1.0, 0.2}, //rx 2
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf
new file mode 100644
index 0000000000..6af1356088
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf
@@ -0,0 +1,266 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac";
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ min_rxtxtime = 6;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 2150 MHz + 12 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block
+ absoluteFrequencySSB = 430432;
+ dl_frequencyBand = 66;
+ # this is 2150 MHz
+ dl_absoluteFrequencyPointA = 430000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 0;
+ dl_carrierBandwidth = 25;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=25 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 0;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 66;
+ ul_absoluteFrequencyPointA = 350000;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 0;
+ ul_carrierBandwidth = 25;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 0;
+ #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 = -118;
+#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 = 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 = 0;
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0;
+
+ 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 = 0x1;
+
+# 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 = 0;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 0;
+ # 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;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ thread_pool_size = 8;
+ 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 = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 50;
+ 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];
+ sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+ clock_src = "external";
+ # if_freq = 3700000000L;
+ # if_offset = 1000000;
+ }
+);
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_DISABLE";
+ }
+);
+
+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";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ };
+
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 e645094e8b..cd84e699c7 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
@@ -30,6 +30,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
min_rxtxtime = 2;
+ do_CSIRS = 1;
do_SRS = 1;
pdcch_ConfigSIB1 = (
@@ -167,6 +168,64 @@ gNBs =
);
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+ # BWP-Downlink
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ dl_bwp-Id_2 = 2;
+ dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ dl_bwp-Id_3 = 3;
+ dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp3_subcarrierSpacing = 1;
+
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+
+ # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ # spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+ # UplinkConfig
+ # BWP-Uplink
+ # BWP 1 Configuration
+ ul_bwp-Id_1 = 1;
+ ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ ul_bwp-Id_2 = 2;
+ ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ ul_bwp-Id_3 = 3;
+ ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp3_subcarrierSpacing = 1;
+
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+ }
+);
# ------- SCTP definitions
SCTP :
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
index 2881a77d48..ef34e68934 100644
--- 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
@@ -31,6 +31,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
+ do_CSIRS = 1;
do_SRS = 1;
ul_prbblacklist = "51,52,53,54"
@@ -68,7 +69,7 @@ gNBs =
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
- initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPcontrolResourceSetZero = 12;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
@@ -169,6 +170,64 @@ gNBs =
);
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+ # BWP-Downlink
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ dl_bwp-Id_2 = 2;
+ dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ dl_bwp-Id_3 = 3;
+ dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp3_subcarrierSpacing = 1;
+
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+
+ # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ # spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+ # UplinkConfig
+ # BWP-Uplink
+ # BWP 1 Configuration
+ ul_bwp-Id_1 = 1;
+ ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ ul_bwp-Id_2 = 2;
+ ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ ul_bwp-Id_3 = 3;
+ ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp3_subcarrierSpacing = 1;
+
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+ }
+);
# ------- SCTP definitions
SCTP :
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf
new file mode 100644
index 0000000000..74f2f9c11c
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf
@@ -0,0 +1,320 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // 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 = 4;
+ pusch_AntennaPorts = 4;
+ sib1_tda = 0;
+
+ 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 = 28875; # 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 = 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 = 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;
+ };
+
+
+ ////////// MME 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;
+ }
+);
+
+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
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 4
+ nb_rx = 4
+ 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, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+ 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";
+ }
+);
+
+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 ="info";
+ ngap_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 e3024737ee..eceb7c1755 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
@@ -30,6 +30,8 @@ gNBs =
ssb_SubcarrierOffset = 0;
min_rxtxtime = 2;
+ do_CSIRS = 1;
+ do_SRS = 1;
pdcch_ConfigSIB1 = (
{
@@ -166,6 +168,64 @@ gNBs =
);
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+ # BWP-Downlink
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ dl_bwp-Id_2 = 2;
+ dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ dl_bwp-Id_3 = 3;
+ dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp3_subcarrierSpacing = 1;
+
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+
+ # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ # spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+ # UplinkConfig
+ # BWP-Uplink
+ # BWP 1 Configuration
+ ul_bwp-Id_1 = 1;
+ ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp1_subcarrierSpacing = 1;
+
+ # BWP 2 Configuration
+ ul_bwp-Id_2 = 2;
+ ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp2_subcarrierSpacing = 1;
+
+ # BWP 3 Configuration
+ ul_bwp-Id_3 = 3;
+ ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp3_subcarrierSpacing = 1;
+
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+ }
+);
# ------- SCTP definitions
SCTP :
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
index b8d71015c1..e3ecf87ca0 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
@@ -21,17 +21,18 @@ gNBs =
sd = 0x1; // 0 false, else true
}
);
-
});
nr_cellid = 12345678L;
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts_N1 = 1;
- pusch_AntennaPorts = 2;
- ul_prbblacklist = "79,80,81,82"
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts_XP = 1;
+ pusch_AntennaPorts = 2;
+ do_CSIRS = 0;
+ ul_prbblacklist = "79,80,81,82"
+
pdcch_ConfigSIB1 = (
{
controlResourceSetZero = 12;
@@ -66,21 +67,8 @@ gNBs =
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
- initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPcontrolResourceSetZero = 12;
initialDLBWPsearchSpaceZero = 10;
- #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
@@ -135,22 +123,6 @@ gNBs =
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig = 0,
- # pusch-ConfigCommon (up to 16 elements)
- initialULBWPk2_0 = 2;
- initialULBWPmappingType_0 = 1
- # this is SS=2 L=13
- initialULBWPstartSymbolAndLength_0 = 41;
-
- initialULBWPk2_1 = 2;
- 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;
@@ -243,16 +215,16 @@ L1s = (
num_cc = 1;
tr_n_preference = "local_mac";
prach_dtx_threshold = 120;
- pucch0_dtx_threshold = 100;
+ pucch0_dtx_threshold = 80;
}
);
RUs = (
{
local_rf = "yes"
- nb_tx = 2
- nb_rx = 2
- att_tx = 0
+ nb_tx = 2;
+ nb_rx = 2;
+ att_tx = 0;
att_rx = 0;
bands = [78];
max_pdschReferenceSignalPower = -27;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf
new file mode 100644
index 0000000000..763396998d
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf
@@ -0,0 +1,321 @@
+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
+ }
+ );
+ });
+
+ nr_cellid = 12345678L;
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts_XP = 1;
+ pusch_AntennaPorts = 2;
+ do_CSIRS = 0;
+ ul_prbblacklist = "107,108,109,110"
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 12;
+ searchSpaceZero = 10;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3300.24 + 106*12*30e3 = 3338.40 MHz (5G NR GSCN: 7734)
+ absoluteFrequencySSB = 622560;
+ dl_frequencyBand = 78;
+ # this is 3300.24 MHz
+ dl_absoluteFrequencyPointA = 620016;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 217;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+ initialDLBWPlocationAndBandwidth = 31624;
+ #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 10;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 217;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 31624;
+# 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 = -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 = 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,
+
+ 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;
+ }
+
+ );
+
+
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+ # BWP-Downlink
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+
+ # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ # spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+ # UplinkConfig
+ # BWP-Uplink
+ # BWP 1 Configuration
+ ul_bwp-Id_1 = 1;
+ ul_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp1_subcarrierSpacing = 1;
+
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+ }
+);
+
+
+
+ # ------- 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;
+ pusch_FailureThres = 1000;
+ ulsch_max_frame_inactivity = 0;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 80;
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 2;
+ nb_rx = 2;
+ 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];
+ #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";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ ngap_log_level ="debug";
+ f1ap_log_level ="debug";
+};
\ No newline at end of file
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf
new file mode 100644
index 0000000000..3d93f2cfab
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf
@@ -0,0 +1,321 @@
+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
+ }
+ );
+ });
+
+ nr_cellid = 12345678L;
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts_XP = 1;
+ pusch_AntennaPorts = 2;
+ do_CSIRS = 0;
+ ul_prbblacklist = "135,136,137,138"
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 12;
+ searchSpaceZero = 10;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
+ absoluteFrequencySSB = 623232;
+ dl_frequencyBand = 78;
+ # this is 3300.24 MHz
+ dl_absoluteFrequencyPointA = 620016;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 273;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+ initialDLBWPlocationAndBandwidth = 31624;
+ #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 10;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 273;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 31624;
+# 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 = -90;
+#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,
+
+ 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;
+ }
+
+ );
+
+
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+ # BWP-Downlink
+ # BWP 1 Configuration
+ dl_bwp-Id_1 = 1;
+ dl_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_bwp1_subcarrierSpacing = 1;
+
+ firstActiveDownlinkBWP-Id = 1; #BWP-Id
+ defaultDownlinkBWP-Id = 1; #BWP-Id
+
+ # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ # spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+ # UplinkConfig
+ # BWP-Uplink
+ # BWP 1 Configuration
+ ul_bwp-Id_1 = 1;
+ ul_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW)
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_bwp1_subcarrierSpacing = 1;
+
+ firstActiveUplinkBWP-Id = 1; #BWP-Id
+ }
+);
+
+
+
+ # ------- 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;
+ pusch_FailureThres = 1000;
+ ulsch_max_frame_inactivity = 0;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 80;
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 2;
+ nb_rx = 2;
+ 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];
+ #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";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ ngap_log_level ="debug";
+ f1ap_log_level ="debug";
+};
\ No newline at end of file
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 49f7db2867..a3048995a5 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -1135,7 +1135,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
}
for (int i=0;iulsch[i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0);
if (!eNB->ulsch[i]) {
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 571551cee9..836709b473 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -1371,11 +1371,12 @@ void fill_rf_config(RU_t *ru,
cfg->tx_gain[i] = (double)ru->att_tx;
cfg->rx_gain[i] = ru->max_rxgain-(double)ru->att_rx;
cfg->configFilename = rf_config_file;
- LOG_I(PHY,"channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n",
+ LOG_I(PHY,"channel %d, Setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f Hz\n",
i, cfg->tx_gain[i],
cfg->rx_gain[i],
cfg->tx_freq[i],
- cfg->rx_freq[i]);
+ cfg->rx_freq[i],
+ cfg->tune_offset);
}
}
@@ -2972,6 +2973,8 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
ru[j]->openair0_cfg.time_source = unset;
}
+ ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset;
+
LOG_I(PHY,"RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr));
if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) ru[j]->is_slave=1;
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 089941c7df..678b6e0401 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -446,6 +446,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
openair0_cfg[card].num_rb_dl=frame_parms->N_RB_DL;
openair0_cfg[card].clock_source = get_softmodem_params()->clock_source;
openair0_cfg[card].time_source = get_softmodem_params()->timing_source;
+ openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset;
openair0_cfg[card].tx_num_channels=min(2,frame_parms->nb_antennas_tx);
openair0_cfg[card].rx_num_channels=min(2,frame_parms->nb_antennas_rx);
@@ -464,11 +465,12 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
openair0_cfg[card].rx_gain[i] = rxgain - rx_gain_off;
openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
- printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
+ printf("Card %d, channel %d, Setting tx_gain %.0f, rx_gain %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f\n",
card,i, openair0_cfg[card].tx_gain[i],
openair0_cfg[card].rx_gain[i],
openair0_cfg[card].tx_freq[i],
- openair0_cfg[card].rx_freq[i]);
+ openair0_cfg[card].rx_freq[i],
+ openair0_cfg[card].tune_offset);
}
if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;