diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf
index 8f3b03fddc..3b872e56e9 100644
--- a/ci-scripts/conf_files/benetel-5g.conf
+++ b/ci-scripts/conf_files/benetel-5g.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 51ffb1d5cd..a648db0efe 100644
--- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -32,7 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
{
diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
index eac0b74633..0db6ac9036 100644
--- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index f80ce3751a..84cb18d435 100644
--- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -32,7 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
index f61039ff17..270ad75845 100644
--- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf
index 9d64ae1976..f6d3e8575a 100644
--- a/ci-scripts/conf_files/gNB_SA_CU.conf
+++ b/ci-scripts/conf_files/gNB_SA_CU.conf
@@ -44,7 +44,6 @@ gNBs =
local_s_portd = 2152;
remote_s_portc = 500;
remote_s_portd = 2152;
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf
index f95bdf91ae..4309c13dd3 100644
--- a/ci-scripts/conf_files/gNB_SA_DU.conf
+++ b/ci-scripts/conf_files/gNB_SA_DU.conf
@@ -36,7 +36,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
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 04dc1b1373..49383072ed 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
@@ -37,7 +37,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
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 fd52c7fed5..610485fc92 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
@@ -38,7 +38,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index dcb3dd89b7..24ec8f17f8 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
index 1019ec75ad..b3c7d7d1da 100644
--- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
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 03155b85d8..c668601c06 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
@@ -19,7 +19,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
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.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
index 5e6b3fb217..92c3a7a2e9 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
@@ -41,7 +41,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pusch_AntennaPorts = 2;
ul_prbblacklist = "51,52,53,54"
do_SRS = 1;
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 09d9b50335..672713d504 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
@@ -37,7 +37,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
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.ddsuu.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
index 18ca7b5d1e..5bd8b26e05 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
@@ -37,7 +37,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pusch_AntennaPorts = 2;
ul_prbblacklist = "51,52,53,54"
do_SRS = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 9e1f499f03..e1264bd069 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -37,7 +37,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
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 42fc89b2ed..f92242138c 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
@@ -37,7 +37,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
#pusch_TargetSNRx10 = 200;
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index 835e334bbb..9334f2cf59 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index f3515d3882..cd3ab6278e 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -19,7 +19,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
servingCellConfigCommon = (
{
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
index 8f480d3757..371753eccc 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
@@ -20,7 +20,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
min_rxtxtime = 6;
servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
index b78ca916f3..197e1d211c 100644
--- a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
@@ -32,7 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
index bd3076a014..ad1471339a 100644
--- a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
@@ -32,9 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
sib1_tda = 15;
min_rxtxtime = 6;
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 3e99d04ff4..25e10931c7 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1952,6 +1952,7 @@ set (MAC_SRC_UE
set (MAC_NR_SRC_UE
${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c
+ ${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c
${NR_UE_MAC_DIR}/config_ue.c
${NR_UE_MAC_DIR}/mac_vars.c
${NR_UE_MAC_DIR}/main_ue_nr.c
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 61b5b8ba95..88654ac9b5 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1062,7 +1062,8 @@
(Test3: PBCH-only, 217 PRB),
(Test4: PBCH and synchronization, 217 RPB),
(Test5: PBCH-only, 273 PRB),
- (Test6: PBCH and synchronization, 273 PRB)
+ (Test6: PBCH and synchronization, 273 PRB),
+ (Test7: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1074,8 +1075,9 @@
-s-11 -S-8 -n10 -R217
-s-11 -S-8 -n10 -o8000 -I -R217
-s-11 -S-8 -n10 -R273
- -s-11 -S-8 -n10 -o8000 -I -R273
- nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6
+ -s-11 -S-8 -n10 -o8000 -I -R273
+ -s-11 -S-8 -n10 -R106 -O6
+ nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 nr_pbchsim.test7
PBCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 179e2de428..95f237ab33 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -109,6 +109,7 @@ check_supported_distribution() {
"ubuntu18.04") return 0 ;;
"ubuntu16.04") return 0 ;;
"fedora35") return 0 ;;
+ "fedora36") return 0 ;;
"rhel7") return 0 ;;
"rhel7.6") return 0 ;;
"rhel7.7") return 0 ;;
@@ -623,7 +624,6 @@ check_install_additional_tools (){
android-tools-adb \
wvdial \
sshpass \
- nscd \
bc \
ntp"
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
@@ -648,7 +648,6 @@ check_install_additional_tools (){
wvdial \
numpy \
sshpass \
- nscd \
python2-paramiko \
python-pyroute2 \
python-netifaces \
@@ -676,7 +675,6 @@ check_install_additional_tools (){
wvdial \
python-numpy \
sshpass \
- nscd \
python-paramiko \
python-pyroute2 \
python-netifaces \
diff --git a/doc/testing_gnb_w_cots_ue_resources/gnb.conf b/doc/testing_gnb_w_cots_ue_resources/gnb.conf
index c96d207445..206e1b4f02 100755
--- a/doc/testing_gnb_w_cots_ue_resources/gnb.conf
+++ b/doc/testing_gnb_w_cots_ue_resources/gnb.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
- pdsch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index c96aeab432..75d78738fc 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -60,7 +60,7 @@ int nr_phy_init_RU(RU_t *ru) {
for (i=0; inb_tx; i++) {
// Allocate 10 subframes of I/Q TX signal data (time) if not
- ru->common.txdata[i] = (int32_t*)malloc16_clear((ru->sf_extension +fp->samples_per_frame) *sizeof(int32_t));
+ ru->common.txdata[i] = (int32_t*)malloc16_clear((ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t));
LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes,sf_extension %d)\n",i,ru->common.txdata[i],
(ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t),ru->sf_extension);
ru->common.txdata[i] = &ru->common.txdata[i][ru->sf_extension];
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 0b665737a7..8f5e33d6e0 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -41,7 +41,7 @@
#include
#include
#include
-#if RHEL_RELEASE_CODE >= 1796
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403
#include
#include
#else
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
index 7d063e326e..83c74389cf 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
@@ -14,7 +14,7 @@ data storage. */
#include
#include
#include
-#if RHEL_RELEASE_CODE >= 1796
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403
#include
#include
#else
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 5617b8e58b..5caf1afb78 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -278,16 +278,30 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
uint8_t maxpos=0;
uint8_t index=0;
+ int nb_re_pucch = 12*pucch_pdu->prb_size; // prb size is 1
+ int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch],*tmp_rp;
+
for (int l=0; lnr_of_symbols; l++) {
l2 = l+pucch_pdu->start_symbol_index;
+
re_offset[l] = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
if (re_offset[l]>= frame_parms->ofdm_symbol_size)
re_offset[l]-=frame_parms->ofdm_symbol_size;
-
- AssertFatal(re_offset[l]+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
+
for (int aa=0;aanb_antennas_rx;aa++) {
- c16_t *r=(c16_t*)&rxdataF[aa][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[l]];
- for (n=0;n<12;n++) {
+ tmp_rp = &rxdataF[aa][soffset + l2*frame_parms->ofdm_symbol_size];
+ if(re_offset[l] + nb_re_pucch > frame_parms->ofdm_symbol_size) {
+ int neg_length = frame_parms->ofdm_symbol_size-re_offset[l];
+ int pos_length = nb_re_pucch-neg_length;
+ memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],neg_length*sizeof(int32_t));
+ memcpy1((void*)&rp[aa][l][neg_length],(void*)tmp_rp,pos_length*sizeof(int32_t));
+ }
+ else
+ memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],nb_re_pucch*sizeof(int32_t));
+
+ c16_t *r = (c16_t*)&rp[aa][l];
+
+ for (n=0;nmeasurements.n0_subband_power_tot_dB[prb_offset[1]]);
int SNRtimes10,sigenergy=0;
for (int aa=0;aanb_antennas_rx;aa++)
- sigenergy += signal_energy_nodc(&rxdataF[aa][soffset+
- (pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size)+
- re_offset[0]],12);
+ sigenergy += signal_energy_nodc(rp[aa][0],12);
SNRtimes10 = xrtmag_dBtimes10-(10*max_n0);
int cqi;
if (SNRtimes10 < -640) cqi=0;
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index d13fe260de..47e17cc935 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -907,7 +907,7 @@ typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_rela
-#define MCS_COUNT 28
+#define MCS_COUNT 29
#define MCS_TABLE_LENGTH_MAX 64
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 48728ba44a..5c08a0f479 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -251,7 +251,6 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
if (number_dl_pdu>0)
oai_nfapi_dl_tti_req(DL_req);
-
}
stop_meas(&gNB->schedule_response_stats);
}
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 0d54caceb3..2c56e2e4b2 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -50,19 +50,6 @@ uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,25
extern uint8_t nfapi_mode;
-void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp) {
-
- uint8_t sco = 0;
- if (((fp->freq_range == nr_FR1) && (cfg->ssb_table.ssb_subcarrier_offset.value<24)) ||
- ((fp->freq_range == nr_FR2) && (cfg->ssb_table.ssb_subcarrier_offset.value<12)) ) {
- if (fp->freq_range == nr_FR1)
- sco = cfg->ssb_table.ssb_subcarrier_offset.value>>cfg->ssb_config.scs_common.value;
- }
-
- fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + sco);
- LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco);
-}
-
void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu) {
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
@@ -84,7 +71,9 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
- nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier
+ // setting the first subcarrier
+ fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
+ LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 1a526174f0..78b253ca2a 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -210,7 +210,6 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
}
void config_common(int Mod_idP,
- int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc);
@@ -242,10 +241,10 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP,
return 0;
}
-nr_bler_struct nr_bler_data[NR_NUM_MCS];
-
void processSlotTX(void *arg) {}
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
//nFAPI P7 dummy functions to avoid linking errors
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0); }
@@ -857,9 +856,9 @@ int main(int argc, char **argv)
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL);
+ rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
// reset preprocessor to the one of DLSIM after it has been set during
// rrc_mac_config_req_gNB
gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index ca696d4f9c..07c5f118dc 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -171,6 +171,7 @@ int main(int argc, char **argv)
uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
uint16_t Nid_cell=0;
uint64_t SSB_positions=0x01;
+ int ssb_subcarrier_offset = 0;
channel_desc_t *gNB2UE;
@@ -214,7 +215,7 @@ int main(int argc, char **argv)
exit_fun("[NR_PBCHSIM] Error, configuration module init failed\n");
}
- while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:P:r:R:s:S:x:y:z:")) != -1) {
+ while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:O:P:r:R:s:S:x:y:z:")) != -1) {
switch (c) {
/*case 'f':
write_output_file=1;
@@ -312,6 +313,10 @@ int main(int argc, char **argv)
Nid_cell = atoi(optarg);
break;
+ case 'O':
+ ssb_subcarrier_offset = atoi(optarg);
+ break;
+
case 'o':
cfo = atof(optarg);
#ifdef DEBUG_NR_PBCHSIM
@@ -414,6 +419,7 @@ int main(int argc, char **argv)
printf("-n Number of frames to simulate\n");
printf("-N Nid_cell\n");
printf("-o Carrier frequency offset in Hz\n");
+ printf("-O SSB subcarrier offset\n");
//printf("-O oversampling factor (1,2,4,8,16)\n");
//printf("-p Use extended prefix mode\n");
printf("-P PBCH phase, allowed values 0-3\n");
@@ -457,7 +463,7 @@ int main(int argc, char **argv)
nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
phy_init_nr_gNB(gNB,0,1);
- nr_set_ssb_first_subcarrier(&gNB->gNB_config,frame_parms);
+ frame_parms->ssb_start_subcarrier = 12 * gNB->gNB_config.ssb_table.ssb_offset_point_a.value + ssb_subcarrier_offset;
uint8_t n_hf = 0;
int cyclic_prefix_type = NFAPI_CP_NORMAL;
@@ -580,6 +586,7 @@ int main(int argc, char **argv)
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33;
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i;
+ msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = ssb_subcarrier_offset;
start_symbol = nr_get_ssb_start_symbol(frame_parms,i);
int slot = start_symbol/14;
@@ -722,8 +729,8 @@ int main(int argc, char **argv)
if (ret<0) n_errors++;
}
else {
- UE_nr_rxtx_proc_t proc={0};
- NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
+ UE_nr_rxtx_proc_t proc={0};
+ NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
UE->rx_offset=0;
uint8_t ssb_index = 0;
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 63a24a7c13..80a638db73 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -640,6 +640,7 @@ int main(int argc, char **argv)
pucch_pdu.initial_cyclic_shift = 0;
pucch_pdu.start_symbol_index = startingSymbolIndex;
pucch_pdu.prb_start = startingPRB;
+ pucch_pdu.prb_size = 1;
pucch_pdu.bwp_start = 0;
pucch_pdu.bwp_size = N_RB_DL;
if (nrofSymbols>1) {
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 43bef59df4..ffb168fd68 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -800,9 +800,9 @@ int main(int argc, char **argv)
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);
+ rrc_mac_config_req_gNB(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,
+ rrc_mac_config_req_gNB(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;
diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c
index 82b1557a5b..0ba9e196b1 100644
--- a/openair1/SIMULATION/TOOLS/rangen_double.c
+++ b/openair1/SIMULATION/TOOLS/rangen_double.c
@@ -42,7 +42,6 @@ void randominit(unsigned seed_init)
{
int i;
// this need to be integrated with the existing rng, like taus: navid
- printf("Initializing random number generator, seed %x\n",seed_init);
if (seed_init == 0) {
srand((unsigned)time(NULL));
@@ -51,6 +50,7 @@ void randominit(unsigned seed_init)
} else {
seed = seed_init;
}
+ printf("Initializing random number generator, seed %x\n",seed);
if (seed % 2 == 0) seed += 1; /* seed and mod are relative prime */
diff --git a/openair2/COMMON/f1ap_messages_def.h b/openair2/COMMON/f1ap_messages_def.h
index 0e857f3a83..f28e0e5ddf 100644
--- a/openair2/COMMON/f1ap_messages_def.h
+++ b/openair2/COMMON/f1ap_messages_def.h
@@ -46,6 +46,8 @@ MESSAGE_DEF(F1AP_DL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_dl_rrc
//MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req )
MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_req)
MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_resp)
+MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_req)
+MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_resp)
diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index 5e5b4c37d3..ae050e2bc2 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -39,15 +39,15 @@
#define F1AP_INITIAL_UL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_initial_ul_rrc_message
#define F1AP_UL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ul_rrc_message
#define F1AP_UE_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_req
-#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp
+#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp
#define F1AP_UE_CONTEXT_RELEASE_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_resp
+#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req
#define F1AP_UE_CONTEXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_resp
#define F1AP_UE_CONTEXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_fail
#define F1AP_DL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_dl_rrc_message
#define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
#define F1AP_UE_CONTEXT_RELEASE_CMD(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
-#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req
/* Length of the transport layer address string
* 160 bits / 8 bits by char.
@@ -345,6 +345,35 @@ typedef struct f1ap_rb_failed_to_be_setup_s {
long rb_id;
} f1ap_rb_failed_to_be_setup_t;
+typedef struct cu_to_du_rrc_information_s {
+ uint8_t * cG_ConfigInfo;
+ uint32_t cG_ConfigInfo_length;
+ uint8_t * uE_CapabilityRAT_ContainerList;
+ uint32_t uE_CapabilityRAT_ContainerList_length;
+ uint8_t * measConfig;
+ uint32_t measConfig_length;
+}cu_to_du_rrc_information_t;
+
+typedef struct du_to_du_rrc_information_s {
+ uint8_t * cellGroupConfig;
+ uint8_t cellGroupConfig_length;
+ uint8_t * measGapConfig;
+ uint8_t measGapConfig_length;
+ uint8_t * requestedP_MaxFR1;
+ uint8_t requestedP_MaxFR1_length;
+}du_to_cu_rrc_information_t;
+
+typedef enum QoS_information_e {
+ NG_RAN_QoS = 0,
+ EUTRAN_QoS = 1,
+} QoS_information_t;
+
+typedef enum ReconfigurationCompl_e {
+ RRCreconf_info_not_present = 0,
+ RRCreconf_failure = 1,
+ RRCreconf_success = 2,
+} ReconfigurationCompl_t;
+
typedef struct f1ap_ue_context_setup_s {
uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti
uint32_t gNB_DU_ue_id;
@@ -357,40 +386,27 @@ typedef struct f1ap_ue_context_setup_s {
uint8_t servCellIndex;
uint8_t *cellULConfigured;
uint32_t servCellId;
- uint8_t *cu_to_du_rrc_information;
+ cu_to_du_rrc_information_t *cu_to_du_rrc_information;
uint8_t cu_to_du_rrc_information_length;
- uint8_t *du_to_cu_rrc_information;
- uint8_t du_to_cu_rrc_information_length;
- f1ap_drb_to_be_setup_t *drbs_to_be_setup; // BK: need to replace by s1ap_initial_context_setup_req
- uint8_t drbs_to_be_setup_length; // BK: need to replace by s1ap_initial_context_setup_req
+ //uint8_t *du_to_cu_rrc_information;
+ du_to_cu_rrc_information_t *du_to_cu_rrc_information;
+ uint32_t du_to_cu_rrc_information_length;
+ f1ap_drb_to_be_setup_t *drbs_to_be_setup;
+ uint8_t drbs_to_be_setup_length;
+ f1ap_drb_to_be_setup_t *drbs_to_be_modified;
+ uint8_t drbs_to_be_modified_length;
+ QoS_information_t QoS_information_type;
uint8_t drbs_failed_to_be_setup_length;
f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup;
f1ap_srb_to_be_setup_t *srbs_to_be_setup;
uint8_t srbs_to_be_setup_length;
uint8_t srbs_failed_to_be_setup_length;
f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
- s1ap_initial_context_setup_req_t *s1ap_initial_context_setup_req;
- // coniatner for the rrc_eNB_generate_SecurityModeCommand message
+ ReconfigurationCompl_t ReconfigComplOutcome;
uint8_t *rrc_container;
int rrc_container_length;
} f1ap_ue_context_setup_t;
-typedef struct f1ap_ue_context_setup_resp_s {
- uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti
- uint32_t gNB_DU_ue_id;
- uint16_t rnti;
- uint8_t du_to_cu_rrc_information[1024 /*Arbitrarily big enough*/];
- uint32_t du_to_cu_rrc_information_length;
- f1ap_drb_to_be_setup_t *drbs_setup; // BK: need to replace by s1ap_initial_context_setup_req
- uint8_t drbs_setup_length; // BK: need to replace by s1ap_initial_context_setup_req
- f1ap_srb_to_be_setup_t *srbs_setup;
- uint8_t srbs_setup_length;
- uint8_t srbs_failed_to_be_setup_length;
- f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
- uint8_t drbs_failed_to_be_setup_length;
- f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup;
-} f1ap_ue_context_setup_resp_t;
-
typedef enum F1ap_Cause_e {
F1AP_CAUSE_NOTHING, /* No components present */
F1AP_CAUSE_RADIO_NETWORK,
diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h
index 44e9d4fbdf..e0e5db5b7f 100644
--- a/openair2/COMMON/gtpv1_u_messages_def.h
+++ b/openair2/COMMON/gtpv1_u_messages_def.h
@@ -27,4 +27,5 @@ MESSAGE_DEF(GTPV1U_ENB_END_MARKER_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_end
MESSAGE_DEF(GTPV1U_ENB_END_MARKER_IND, MESSAGE_PRIORITY_MED, gtpv1u_enb_end_marker_ind_t, Gtpv1uEndMarkerInd)
MESSAGE_DEF(GTPV1U_REQ, MESSAGE_PRIORITY_MED, Gtpv1uReq, gtpv1uReq)
-MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t, NRGtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t, NRGtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_DU_BUFFER_REPORT_REQ, MESSAGE_PRIORITY_MED, gtpv1u_DU_buffer_report_req_t, NRGtpv1uBufferReportReq)
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 096f0f4697..4111b00024 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -39,6 +39,8 @@
#define GTPV1U_GNB_TUNNEL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.NRGtpv1uTunnelDataReq
+#define GTPV1U_DU_BUFFER_REPORT_REQ(mSGpTR) (mSGpTR)->ittiMsg.NRGtpv1uBufferReportReq
+
#define GTPV1U_ALL_TUNNELS_TEID (teid_t)0xFFFFFFFF
typedef struct gtpv1u_enb_create_x2u_tunnel_req_s {
@@ -213,4 +215,10 @@ typedef struct gtpv1u_gnb_tunnel_data_req_s {
pdusessionid_t pdusession_id;
} gtpv1u_gnb_tunnel_data_req_t;
+typedef struct gtpv1u_DU_buffer_report_req_s {
+ uint32_t buffer_availability;
+ rnti_t rnti;
+ pdusessionid_t pdusession_id;
+} gtpv1u_DU_buffer_report_req_t;
+
#endif /* GTPV1_U_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 67b0b610cc..18e7c4bd18 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -417,7 +417,6 @@ typedef struct NRRrcConfigurationReq_s {
uint8_t num_plmn;
NR_ServingCellConfigCommon_t *scc;
NR_ServingCellConfig_t *scd;
- int ssb_SubcarrierOffset;
int sib1_tda;
rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts;
int pusch_AntennaPorts;
diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c
index b3c7363ca4..efbc9f2c8b 100644
--- a/openair2/F1AP/f1ap_cu_task.c
+++ b/openair2/F1AP/f1ap_cu_task.c
@@ -180,6 +180,12 @@ void *F1AP_CU_task(void *arg) {
&F1AP_UE_CONTEXT_SETUP_REQ(received_msg));
break;
+ case F1AP_UE_CONTEXT_MODIFICATION_REQ:
+ LOG_I(F1AP, "CU Task received F1AP_UE_CONTEXT_MODIFICATION_REQ\n");
+ CU_send_UE_CONTEXT_MODIFICATION_REQUEST(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
+ &F1AP_UE_CONTEXT_MODIFICATION_REQ(received_msg));
+ break;
+
case F1AP_UE_CONTEXT_RELEASE_CMD: // from rrc
LOG_I(F1AP, "CU Task Received F1AP_UE_CONTEXT_RELEASE_CMD\n");
CU_send_UE_CONTEXT_RELEASE_COMMAND(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c
index c68bfb3852..859a9f5e0d 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.c
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.c
@@ -131,21 +131,30 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie6->criticality = F1AP_Criticality_reject;
ie6->value.present = F1AP_UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
- /* optional */
- /* 6.1 cG_ConfigInfo */
- if (0) {
- const char cG_ConfigInfoStr[]="asdsa1d32sa1d31asd31as";
- asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
- OCTET_STRING_fromBuf(cG_ConfigInfo, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+ if (f1ap_ue_context_setup_req->cu_to_du_rrc_information!=NULL) {
+ /* optional */
+ /* 6.1 cG_ConfigInfo */
+ if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
+ OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo,
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
+ }
/* optional */
/* 6.2 uE_CapabilityRAT_ContainerList */
- asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
- OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+ if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
+ OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+ }
/* optional */
/* 6.3 measConfig */
- asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig);
- OCTET_STRING_fromBuf(measConfig, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+ if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig);
+ OCTET_STRING_fromBuf(measConfig, (const char*)f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig,
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig_length);
+ }
}
+
/* mandatory */
/* c7. Candidate_SpCell_List */
@@ -238,199 +247,96 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* mandatory */
/* c11. SRBs_ToBeSetup_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11);
- ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List;
- ie11->criticality = F1AP_Criticality_reject; // ?
- ie11->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
+ if(f1ap_ue_context_setup_req->srbs_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11);
+ ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List;
+ ie11->criticality = F1AP_Criticality_reject; // ?
+ ie11->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
- for (int i=0; isrbs_to_be_setup_length; i++) {
- //
- asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies);
- srbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73
- srbs_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
- srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
- /* 11.1 SRBs_ToBeSetup_Item */
- F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item;
- /* 11.1.1 sRBID */
- srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id;
- /* OPTIONAL */
- /* 11.1.2 duplicationIndication */
- //if (0) {
- asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
+ for (int i=0; isrbs_to_be_setup_length; i++) {
+ asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies);
+ srbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73
+ srbs_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
+ srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
+ /* 11.1 SRBs_ToBeSetup_Item */
+ F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item;
+ /* 11.1.1 sRBID */
+ srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id;
+ /* OPTIONAL */
+ /* 11.1.2 duplicationIndication */
+ asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
F1AP_DuplicationIndication_true); // enum
- //}
+ }
}
/* mandatory */
/* c12. DRBs_ToBeSetup_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
- ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List;
- ie12->criticality = F1AP_Criticality_reject;
- ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
- LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length);
+ if(f1ap_ue_context_setup_req->drbs_to_be_setup_length){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
+ ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List;
+ ie12->criticality = F1AP_Criticality_reject;
+ ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
+ LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length);
- for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) {
- //
- asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies);
- drbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
- drbs_toBeSetup_item_ies->criticality = F1AP_Criticality_reject;
- drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
- /* 12.1 DRBs_ToBeSetup_Item */
- F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item;
- /* 12.1.1 dRBID */
- drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9
- /* 12.1.2 qoSInformation */
- int some_decide_qos = 0; // BK: Need Check
+ for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) {
+ //
+ asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies);
+ drbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
+ drbs_toBeSetup_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
+ /* 12.1 DRBs_ToBeSetup_Item */
+ F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item;
+ /* 12.1.1 dRBID */
+ drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9
+ /* 12.1.2 qoSInformation */
+ int some_decide_qos = 0; // BK: Need Check
- if (some_decide_qos) {
- drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
- /* 12.1.2.1 eUTRANQoS */
- asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS);
- /* 12.1.2.1.1 qCI */
- eUTRANQoS->qCI = 254L;
- /* 12.1.2.1.2 allocationAndRetentionPriority */
- {
- /* 12.1.2.1.2.1 priorityLevel */
- eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
- /* 12.1.2.1.2.2 pre_emptionCapability */
- eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum
- /* 12.1.2.1.2.2 pre_emptionVulnerability */
- eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
- }
-
- /* OPTIONAL */
- /* 12.1.2.1.3 gbrQosInformation */
- if (0) {
- eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t));
- asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L);
- asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L);
- asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L);
- asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L);
- }
- } else {
- /* 12.1.2 DRB_Information */
- drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
- F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
- ie->id = F1AP_ProtocolIE_ID_id_DRB_Information;
- ie->criticality = F1AP_Criticality_reject;
- ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
- F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
- drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
- /* 12.1.2.1 dRB_QoS */
- {
- /* qoS_Characteristics */
+ if (some_decide_qos) {
+ drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
+ /* 12.1.2.1 eUTRANQoS */
+ asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS);
+ /* 12.1.2.1.1 qCI */
+ eUTRANQoS->qCI = 254L;
+ /* 12.1.2.1.2 allocationAndRetentionPriority */
{
- int some_decide_qoS_characteristics = 0; // BK: Need Check
-
- if (some_decide_qoS_characteristics) {
- DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
- setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
- } else {
- DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
- asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
- /* qoSPriorityLevel */
- tmp->qoSPriorityLevel = 1L;
- /* packetDelayBudget */
- tmp->packetDelayBudget = 1L;
- /* packetErrorRate */
- tmp->packetErrorRate.pER_Scalar = 1L;
- tmp->packetErrorRate.pER_Exponent = 6L;
-
- /* OPTIONAL */
- /* delayCritical */
- if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
- }
-
- /* OPTIONAL */
- /* averagingWindow */
- if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
- }
-
- /* OPTIONAL */
- /* maxDataBurstVolume */
- if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
- }
- } // if some_decide_qoS_characteristics
- } // qoS_Characteristics
- /* nGRANallocationRetentionPriority */
- {
- DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
- DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
- DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
- } // nGRANallocationRetentionPriority
-
- /* OPTIONAL */
- /* gBR_QoS_Flow_Information */
- if (0) {
- asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
- asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
- asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
- asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
- asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
-
- /* OPTIONAL */
- /* maxPacketLossRateDownlink */
- if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
- }
-
- /* OPTIONAL */
- /* maxPacketLossRateUplink */
- if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
- }
+ /* 12.1.2.1.2.1 priorityLevel */
+ eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+ /* 12.1.2.1.2.2 pre_emptionCapability */
+ eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum
+ /* 12.1.2.1.2.2 pre_emptionVulnerability */
+ eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
}
/* OPTIONAL */
- /* reflective_QoS_Attribute */
+ /* 12.1.2.1.3 gbrQosInformation */
if (0) {
- asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
+ eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t));
+ asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L);
+ asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L);
+ asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L);
+ asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L);
}
- } // dRB_QoS
- /* 12.1.2.2 sNSSAI */
- {
- /* sST */
- OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
-
- /* OPTIONAL */
- /* sD */
- if (0) {
- asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
- OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
- }
- }
-
- /* OPTIONAL */
- /* 12.1.2.3 notificationControl */
- if (0) {
- asn1cCallocOne(DRB_Information->notificationControl,
- F1AP_NotificationControl_active); // enum
- }
-
- /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
-
- for (int k = 0; k < 1; k ++) {
- asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
- F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
- /* qoSFlowIndicator */
- flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
- /* qoSFlowLevelQoSParameters */
+ } else {
+ /* 12.1.2 DRB_Information */
+ drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
+ F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
+ ie->id = F1AP_ProtocolIE_ID_id_DRB_Information;
+ ie->criticality = F1AP_Criticality_reject;
+ ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
+ F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
+ drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
+ /* 12.1.2.1 dRB_QoS */
{
/* qoS_Characteristics */
{
int some_decide_qoS_characteristics = 0; // BK: Need Check
- F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
if (some_decide_qoS_characteristics) {
- QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
- setQos(QosParams->choice.non_Dynamic_5QI);
+ DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+ setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
} else {
- QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
- asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+ DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+ asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
/* qoSPriorityLevel */
tmp->qoSPriorityLevel = 1L;
/* packetDelayBudget */
@@ -442,36 +348,33 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* OPTIONAL */
/* delayCritical */
if (0) {
- asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
- *tmp = 1L;
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
}
/* OPTIONAL */
/* averagingWindow */
if (0) {
- asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
- *tmp = 1L;
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
}
/* OPTIONAL */
/* maxDataBurstVolume */
if (0) {
- asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
- *tmp= 1L;
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
}
} // if some_decide_qoS_characteristics
} // qoS_Characteristics
/* nGRANallocationRetentionPriority */
{
- flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
- flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
- flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
} // nGRANallocationRetentionPriority
/* OPTIONAL */
/* gBR_QoS_Flow_Information */
if (0) {
- asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+ asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
@@ -480,80 +383,185 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* OPTIONAL */
/* maxPacketLossRateDownlink */
if (0) {
- asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+ asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
}
/* OPTIONAL */
/* maxPacketLossRateUplink */
if (0) {
- asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+ asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
}
}
/* OPTIONAL */
/* reflective_QoS_Attribute */
if (0) {
- asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+ asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
}
- } // qoSFlowLevelQoSParameters
- }
- } // if some_decide_qos
+ } // dRB_QoS
+ /* 12.1.2.2 sNSSAI */
+ {
+ /* sST */
+ OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
- /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
- for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
- /* Here the callback function used as input is not the right one. Need to create a new one probably for F1-U, not sure
- * if the kind of input parameters to the callback function are convenient though for gtp-u over F1-U.*/
- //Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU
- transport_layer_addr_t addr;
- int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
- memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
- addr.length = sz*8;
- f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
- newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
- f1ap_ue_context_setup_req->rnti,
- f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
- f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
- 0xFFFF, // We will set the right value from DU answer
- addr,
- f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
- cu_f1u_data_req);
- /* 12.3.1 ULTunnels_ToBeSetup_Item */
- asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
- F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
- uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
- gTPTunnel);
- /* 12.3.1.1.1 transportLayerAddress */
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
+ /* OPTIONAL */
+ /* sD */
+ if (0) {
+ asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
+ OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
+ strlen("asdsa1d32sa1d31asd31as"));
+ }
+ }
+
+ /* OPTIONAL */
+ /* 12.1.2.3 notificationControl */
+ if (0) {
+ asn1cCallocOne(DRB_Information->notificationControl,
+ F1AP_NotificationControl_active); // enum
+ }
+
+ /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
+
+ for (int k = 0; k < 1; k ++) {
+ asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
+ F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
+ /* qoSFlowIndicator */
+ flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
+ /* qoSFlowLevelQoSParameters */
+ {
+ /* qoS_Characteristics */
+ {
+ int some_decide_qoS_characteristics = 0; // BK: Need Check
+ F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+
+ if (some_decide_qoS_characteristics) {
+ QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+ setQos(QosParams->choice.non_Dynamic_5QI);
+ } else {
+ QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+ asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+ /* qoSPriorityLevel */
+ tmp->qoSPriorityLevel = 1L;
+ /* packetDelayBudget */
+ tmp->packetDelayBudget = 1L;
+ /* packetErrorRate */
+ tmp->packetErrorRate.pER_Scalar = 1L;
+ tmp->packetErrorRate.pER_Exponent = 6L;
+
+ /* OPTIONAL */
+ /* delayCritical */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
+ *tmp = 1L;
+ }
+
+ /* OPTIONAL */
+ /* averagingWindow */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
+ *tmp = 1L;
+ }
+
+ /* OPTIONAL */
+ /* maxDataBurstVolume */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
+ *tmp= 1L;
+ }
+ } // if some_decide_qoS_characteristics
+ } // qoS_Characteristics
+ /* nGRANallocationRetentionPriority */
+ {
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+ } // nGRANallocationRetentionPriority
+
+ /* OPTIONAL */
+ /* gBR_QoS_Flow_Information */
+ if (0) {
+ asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+ asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+ /* OPTIONAL */
+ /* maxPacketLossRateDownlink */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+ }
+
+ /* OPTIONAL */
+ /* maxPacketLossRateUplink */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+ }
+ }
+
+ /* OPTIONAL */
+ /* reflective_QoS_Attribute */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+ }
+ } // qoSFlowLevelQoSParameters
+ }
+ } // if some_decide_qos
+
+ /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
+ for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
+ /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
+ transport_layer_addr_t addr;
+ int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
+ memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
+ addr.length = sz*8;
+ f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
+ newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+ f1ap_ue_context_setup_req->rnti,
+ f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
+ f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
+ 0xFFFF, // We will set the right value from DU answer
+ addr,
+ f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
+ cu_f1u_data_req);
+ /* 12.3.1 ULTunnels_ToBeSetup_Item */
+ asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
+ F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
+ uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+ gTPTunnel);
+ /* 12.3.1.1.1 transportLayerAddress */
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
&gTPTunnel->transportLayerAddress);
- /* 12.3.1.1.2 gTP_TEID */
- INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
- &gTPTunnel->gTP_TEID);
- }
+ /* 12.3.1.1.2 gTP_TEID */
+ INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
+ &gTPTunnel->gTP_TEID);
+ }
- /* 12.1.4 rLCMode */
- /* TODO use rlc_mode from f1ap_drb_to_be_setup */
- switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) {
- case RLC_MODE_AM:
- drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am;
- break;
+ /* 12.1.4 rLCMode */
+ /* TODO use rlc_mode from f1ap_drb_to_be_setup */
+ switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) {
+ case RLC_MODE_AM:
+ drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am;
+ break;
- default:
- drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
- }
+ default:
+ drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
+ }
- /* OPTIONAL */
- /* 12.1.5 ULConfiguration */
- if (0) {
- asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp);
- tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
- }
+ /* OPTIONAL */
+ /* 12.1.5 ULConfiguration */
+ if (0) {
+ asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp);
+ tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
+ }
- /* OPTIONAL */
- /* 12.1.6 duplicationActivation */
- if (0) {
- asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp);
- *tmp = F1AP_DuplicationActivation_active; // enum
+ /* OPTIONAL */
+ /* 12.1.6 duplicationActivation */
+ if (0) {
+ asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp);
+ *tmp = F1AP_DuplicationActivation_active; // enum
+ }
}
}
@@ -662,9 +670,10 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
return -1;
}
- f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
- memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
- f1ap_ue_context_setup_resp->du_to_cu_rrc_information_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
+ f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1,sizeof(du_to_cu_rrc_information_t));
+ f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+ memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+ f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
// DRBs_Setup_List
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
@@ -896,12 +905,14 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
/* optional */
/* c4. RRCContainer */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4);
- ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer;
- ie4->criticality = F1AP_Criticality_ignore;
- ie4->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer;
- OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container,
+ if(cmd->rrc_container!=NULL){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4);
+ ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer;
+ ie4->criticality = F1AP_Criticality_ignore;
+ ie4->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer;
+ OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container,
cmd->rrc_container_length);
+ }
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
@@ -1008,7 +1019,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
return 0;
}
//void CU_send_UE_CONTEXT_MODIFICATION_REQUEST(F1AP_UEContextModificationRequest_t *UEContextModificationRequest) {
-int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
+int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context_setup_t *f1ap_ue_context_modification_req) {
F1AP_F1AP_PDU_t pdu= {0};
F1AP_UEContextModificationRequest_t *out;
uint8_t *buffer=NULL;
@@ -1029,14 +1040,14 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
- ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L;
+ ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
- ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L;
+ ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
/* optional */
/* c3. NRCGI */
@@ -1049,13 +1060,15 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
addnRCGI(ie3->value.choice.NRCGI, &hardCoded);
}
- /* mandatory */
+ /* optional */
/* c4. ServCellIndex */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4);
- ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex;
- ie4->criticality = F1AP_Criticality_reject;
- ie4->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex;
- ie4->value.choice.ServCellIndex = 5L;
+ if(0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4);
+ ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex;
+ ie4->criticality = F1AP_Criticality_reject;
+ ie4->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex;
+ ie4->value.choice.ServCellIndex = 5L;
+ }
/* optional */
/* c5. DRXCycle */
@@ -1077,47 +1090,58 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
}
/* optional */
- /* c5. CUtoDURRCInformation */
- if (1) {
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie5);
- ie5->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
- ie5->criticality = F1AP_Criticality_reject;
- ie5->value.present = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation;
- asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.cG_ConfigInfo, tmp);
- /* optional */
- OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
- asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList,
- tmp2);
- /* optional */
- OCTET_STRING_fromBuf(tmp2, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
- }
-
- /* optional */
- /* c6. TransmissionActionIndicator */
- if (1) {
+ /* c6. CUtoDURRCInformation */
+ if (f1ap_ue_context_modification_req->cu_to_du_rrc_information!=NULL) {
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6);
- ie6->id = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator;
- ie6->criticality = F1AP_Criticality_ignore;
- ie6->value.present = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
- ie6->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop;
+ ie6->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
+ ie6->criticality = F1AP_Criticality_reject;
+ ie6->value.present = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation;
+ /* 6.1 cG_ConfigInfo */
+ if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
+ OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo,
+ f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
+ }
+ /* optional */
+ /* 6.2 uE_CapabilityRAT_ContainerList */
+ if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
+ OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+ f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length) ;
+ }
+ /* optional */
+ /* 6.3 measConfig */
+ if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig!=NULL){
+ asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig);
+ OCTET_STRING_fromBuf(measConfig, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig,
+ f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig_length);
+ }
}
/* optional */
- /* c7. ResourceCoordinationTransferContainer */
+ /* c7. TransmissionActionIndicator */
if (0) {
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7);
- ie7->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
- ie7->criticality = F1AP_Criticality_ignore;
- ie7->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer;
- OCTET_STRING_fromBuf(&ie7->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
+ ie7->id = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator;
+ ie7->criticality = F1AP_Criticality_ignore;
+ ie7->value.present = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
+ ie7->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop;
+ }
+
+ /* optional */
+ /* c8. ResourceCoordinationTransferContainer */
+ if (0) {
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8);
+ ie8->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
+ ie8->criticality = F1AP_Criticality_ignore;
+ ie8->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer;
+ OCTET_STRING_fromBuf(&ie8->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
strlen("asdsa1d32sa1d31asd31as"));
}
/* optional */
/* c7. RRCRconfigurationCompleteIndicator */
- if (1) {
+ if (f1ap_ue_context_modification_req->ReconfigComplOutcome == RRCreconf_success) {
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie71);
ie71->id = F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
ie71->criticality = F1AP_Criticality_ignore;
@@ -1127,218 +1151,487 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
/* optional */
/* c8. RRCContainer */
- if (1) {
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8);
- ie8->id = F1AP_ProtocolIE_ID_id_RRCContainer;
- ie8->criticality = F1AP_Criticality_ignore;
- ie8->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer;
- OCTET_STRING_fromBuf(&ie8->value.choice.RRCContainer, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
+ if (f1ap_ue_context_modification_req->rrc_container != NULL) {
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie81);
+ ie81->id = F1AP_ProtocolIE_ID_id_RRCContainer;
+ ie81->criticality = F1AP_Criticality_ignore;
+ ie81->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer;
+ OCTET_STRING_fromBuf(&ie81->value.choice.RRCContainer, (const char*)f1ap_ue_context_modification_req->rrc_container,
+ f1ap_ue_context_modification_req->rrc_container_length);
}
- /* mandatory */
+ /* optional */
/* c9. SCell_ToBeSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
- ie9->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
- ie9->criticality = F1AP_Criticality_ignore;
- ie9->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
+ if(0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
+ ie9->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
+ ie9->criticality = F1AP_Criticality_ignore;
+ ie9->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
+ for (int i=0; i<1; i++) {
+ //
+ asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
F1AP_SCell_ToBeSetupMod_ItemIEs_t, scell_toBeSetupMod_item_ies);
- scell_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
- scell_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
- scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
- /* 8.1 SCell_ToBeSetup_Item */
- F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
- &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
- // /* - sCell_ID */
- addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
- /* sCellIndex */
- scell_toBeSetupMod_item->sCellIndex = 6; // issue here
+ scell_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
+ scell_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
+ scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
+ /* 8.1 SCell_ToBeSetup_Item */
+ F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
+ &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
+ // /* - sCell_ID */
+ addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
+ /* sCellIndex */
+ scell_toBeSetupMod_item->sCellIndex = 6; // issue here
+ }
}
- /* mandatory */
+ /* optional */
/* c10. SCell_ToBeRemoved_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
- ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
- ie10->criticality = F1AP_Criticality_ignore;
- ie10->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
+ if(0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
+ ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
+ ie10->criticality = F1AP_Criticality_ignore;
+ ie10->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
+ for (int i=0; i<1; i++) {
+ //
+ asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
F1AP_SCell_ToBeRemoved_ItemIEs_t, scell_toBeRemoved_item_ies);
- scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
- //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
- scell_toBeRemoved_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
- scell_toBeRemoved_item_ies->criticality = F1AP_Criticality_ignore;
- scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
- /* 10.1 SCell_ToBeRemoved_Item */
- F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
- &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
- /* - sCell_ID */
- addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
+ scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+ //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+ scell_toBeRemoved_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
+ scell_toBeRemoved_item_ies->criticality = F1AP_Criticality_ignore;
+ scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
+ /* 10.1 SCell_ToBeRemoved_Item */
+ F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
+ &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
+ /* - sCell_ID */
+ addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
+ }
}
/* mandatory */
/* c11. SRBs_ToBeSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
- ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
- ie11->criticality = F1AP_Criticality_reject;
- ie11->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
+ if(f1ap_ue_context_modification_req->srbs_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
+ ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
+ ie11->criticality = F1AP_Criticality_reject;
+ ie11->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List.list,
- F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
- srbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item;
- srbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
- srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
- /* 9.1 SRBs_ToBeSetupMod_Item */
- F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=
- &srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
- /* - sRBID */
- srbs_toBeSetupMod_item->sRBID = 3L;
+ for (int i=0; isrbs_to_be_setup_length; i++) {
+ //
+ asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
+ srbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73
+ srbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
+ srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
+ /* 11.1 SRBs_ToBeSetup_Item */
+ F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
+ /* 11.1.1 sRBID */
+ srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id;
+ /* OPTIONAL */
+ /* 11.1.2 duplicationIndication */
+ asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication,
+ F1AP_DuplicationIndication_true); // enum
+ }
}
/* mandatory */
/* c12. DRBs_ToBeSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
- ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
- ie12->criticality = F1AP_Criticality_reject;
- ie12->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
+ if(f1ap_ue_context_modification_req->drbs_to_be_setup_length){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
+ ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
+ ie12->criticality = F1AP_Criticality_reject;
+ ie12->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
+ for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) {
+ asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
F1AP_DRBs_ToBeSetupMod_ItemIEs_t, drbs_toBeSetupMod_item_ies);
- drbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
- drbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
- drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
- /* 12.1 DRBs_ToBeSetupMod_Item */
- F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
- &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
- /* dRBID */
- drbs_toBeSetupMod_item->dRBID = 30L;
- /* qoSInformation */
- drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
- drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
- drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
- /* uLUPTNLInformation_ToBeSetup_List */
- int maxnoofULTunnels = 1; // 2;
+ drbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
+ drbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
+ /* 12.1 DRBs_ToBeSetupMod_Item */
+ F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
+ &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
+ /* dRBID */
+ drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id;
+ /* qoSInformation */
- for (int j=0; juLUPTNLInformation_ToBeSetup_List.list,
+ if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){
+ drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
+ drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+ drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
+ /* uLUPTNLInformation_ToBeSetup_List */
+ int maxnoofULTunnels = 1; // 2;
+
+ for (int j=0; juLUPTNLInformation_ToBeSetup_List.list,
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
- uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+ uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
gTPTunnel)
- /* transportLayerAddress */
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
- /* gTP_TEID */
- OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
- strlen("4567"));
- }
+ /* transportLayerAddress */
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+ /* gTP_TEID */
+ OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
+ strlen("4567"));
+ }
- /* rLCMode */
- drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
+ /* rLCMode */
+ drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
- /* OPTIONAL */
- /* ULConfiguration */
- if (0) {
- drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
- }
- }
+ /* OPTIONAL */
+ /* ULConfiguration */
+ if (0) {
+ drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+ }
+ } //QoS information
- /* mandatory */
- /* c13. DRBs_ToBeModified_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
- ie13->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
- ie13->criticality = F1AP_Criticality_reject;
- ie13->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
+ else{
+ /* 12.1.2 DRB_Information */
+ drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
+ F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
+ ie->id = F1AP_ProtocolIE_ID_id_DRB_Information;
+ ie->criticality = F1AP_Criticality_reject;
+ ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
+ F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
+ drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
+ /* 12.1.2.1 dRB_QoS */
+ {
+ /* qoS_Characteristics */
+ {
+ int some_decide_qoS_characteristics = 0; // BK: Need Check
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
- F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies);
- drbs_toBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
- drbs_toBeModified_item_ies->criticality = F1AP_Criticality_reject;
- drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
- /* 13.1 SRBs_ToBeModified_Item */
- F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
- &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
- /* dRBID */
- drbs_toBeModified_item->dRBID = 30L;
- /* qoSInformation */
- asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
- tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
- tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
- tmp->choice.eUTRANQoS->qCI = 254L;
- /* ULTunnels_ToBeModified_List */
- int maxnoofULTunnels = 1; // 2;
+ if (some_decide_qoS_characteristics) {
+ DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+ setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
+ } else {
+ DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+ asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
+ /* qoSPriorityLevel */
+ tmp->qoSPriorityLevel = 1L;
+ /* packetDelayBudget */
+ tmp->packetDelayBudget = 1L;
+ /* packetErrorRate */
+ tmp->packetErrorRate.pER_Scalar = 1L;
+ tmp->packetErrorRate.pER_Exponent = 6L;
- for (int j=0; juLUPTNLInformation_ToBeSetup_List.list,
+ /* OPTIONAL */
+ /* delayCritical */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
+ }
+
+ /* OPTIONAL */
+ /* averagingWindow */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
+ }
+
+ /* OPTIONAL */
+ /* maxDataBurstVolume */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
+ }
+ } // if some_decide_qoS_characteristics
+
+ } // qoS_Characteristics
+ /* nGRANallocationRetentionPriority */
+ {
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+ DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+ } // nGRANallocationRetentionPriority
+
+ /* OPTIONAL */
+ /* gBR_QoS_Flow_Information */
+ if (0) {
+ asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
+ asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+ /* OPTIONAL */
+ /* maxPacketLossRateDownlink */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+ }
+
+ /* OPTIONAL */
+ /* maxPacketLossRateUplink */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+ }
+ }
+
+ /* OPTIONAL */
+ /* reflective_QoS_Attribute */
+ if (0) {
+ asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
+ }
+ } // dRB_QoS
+ /* 12.1.2.2 sNSSAI */
+ {
+ /* sST */
+
+ OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+
+ /* OPTIONAL */
+ /* sD */
+ if (0) {
+ asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
+ OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
+ strlen("asdsa1d32sa1d31asd31as"));
+ }
+ }
+
+ /* OPTIONAL */
+ /* 12.1.2.3 notificationControl */
+ if (0) {
+ asn1cCallocOne(DRB_Information->notificationControl,
+ F1AP_NotificationControl_active); // enum
+ }
+
+ /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
+
+ for (int k = 0; k < 1; k ++) {
+ asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
+ F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
+ /* qoSFlowIndicator */
+ flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
+ /* qoSFlowLevelQoSParameters */
+ {
+ /* qoS_Characteristics */
+ {
+ int some_decide_qoS_characteristics = 0; // BK: Need Check
+ F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+
+ if (some_decide_qoS_characteristics) {
+ QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+ setQos(QosParams->choice.non_Dynamic_5QI);
+ } else {
+ QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+ asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+ /* qoSPriorityLevel */
+ tmp->qoSPriorityLevel = 1L;
+ /* packetDelayBudget */
+ tmp->packetDelayBudget = 1L;
+ /* packetErrorRate */
+ tmp->packetErrorRate.pER_Scalar = 1L;
+ tmp->packetErrorRate.pER_Exponent = 6L;
+
+ /* OPTIONAL */
+ /* delayCritical */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
+ *tmp = 1L;
+ }
+
+ /* OPTIONAL */
+ /* averagingWindow */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
+ *tmp = 1L;
+ }
+
+ /* OPTIONAL */
+ /* maxDataBurstVolume */
+ if (0) {
+ asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
+ *tmp= 1L;
+ }
+ } // if some_decide_qoS_characteristics
+
+ } // qoS_Characteristics
+ /* nGRANallocationRetentionPriority */
+ {
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+ flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+ } // nGRANallocationRetentionPriority
+
+ /* OPTIONAL */
+ /* gBR_QoS_Flow_Information */
+ if (0) {
+ asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+ asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+ asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+ /* OPTIONAL */
+ /* maxPacketLossRateDownlink */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+ }
+
+ /* OPTIONAL */
+ /* maxPacketLossRateUplink */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+ }
+ }
+
+ /* OPTIONAL */
+ /* reflective_QoS_Attribute */
+ if (0) {
+ asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+ }
+ } // qoSFlowLevelQoSParameters
+ }
+
+ } //QoS information
+
+ /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
+ for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
+ /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
+ transport_layer_addr_t addr;
+ int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
+ memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
+ addr.length = sz*8;
+
+ f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
+ newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+ f1ap_ue_context_modification_req->rnti,
+ f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
+ f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
+ 0xFFFF, // We will set the right value from DU answer
+ addr,
+ f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
+ cu_f1u_data_req);
+ /* 12.3.1 ULTunnels_ToBeSetup_Item */
+ asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
- uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+ uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+ gTPTunnel);
+ /* 12.3.1.1.1 transportLayerAddress */
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
+ &gTPTunnel->transportLayerAddress);
+ /* 12.3.1.1.2 gTP_TEID */
+ INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
+ &gTPTunnel->gTP_TEID);
+ }
+ /* 12.1.4 rLCMode */
+ /* TODO use rlc_mode from f1ap_drb_to_be_setup */
+ switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) {
+ case RLC_MODE_AM:
+ drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am;
+ break;
+
+ default:
+ drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
+ }
+
+ /* OPTIONAL */
+ /* 12.1.5 ULConfiguration */
+ if (0) {
+ asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp);
+ tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
+ }
+
+ /* OPTIONAL */
+ /* 12.1.6 duplicationActivation */
+ if (0) {
+ asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp);
+ *tmp = F1AP_DuplicationActivation_active; // enum
+ }
+ }
+ }
+
+ /* optional */
+ if(0){
+ /* c13. DRBs_ToBeModified_List */
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
+ ie13->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
+ ie13->criticality = F1AP_Criticality_reject;
+ ie13->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
+
+ for (int i=0; i<1; i++) {
+ //
+ asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
+ F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies);
+ drbs_toBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
+ drbs_toBeModified_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
+ /* 13.1 SRBs_ToBeModified_Item */
+ F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
+ &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
+ /* dRBID */
+ drbs_toBeModified_item->dRBID = 30L;
+ /* qoSInformation */
+ asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
+ tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
+ tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+ tmp->choice.eUTRANQoS->qCI = 254L;
+ /* ULTunnels_ToBeModified_List */
+ int maxnoofULTunnels = 1; // 2;
+
+ for (int j=0; juLUPTNLInformation_ToBeSetup_List.list,
+ F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
+ uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
gTPTunnel);
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
- OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+ OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
strlen("1204"));
- }
+ }
- /* OPTIONAL */
- /* ULConfiguration */
- if (0) {
- drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+ /* OPTIONAL */
+ /* ULConfiguration */
+ if (0) {
+ drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+ }
}
}
- /* mandatory */
- /* c14. SRBs_ToBeReleased_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
- ie14->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
- ie14->criticality = F1AP_Criticality_reject;
- ie14->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
+ /* optional */
+ if(0){
+ /* c14. SRBs_ToBeReleased_List */
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
+ ie14->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
+ ie14->criticality = F1AP_Criticality_reject;
+ ie14->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
+ for (int i=0; i<1; i++) {
+ //
+ asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
F1AP_SRBs_ToBeReleased_ItemIEs_t, srbs_toBeReleased_item_ies);
- srbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
- srbs_toBeReleased_item_ies->criticality = F1AP_Criticality_ignore;
- srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
- /* 9.1 SRBs_ToBeReleased_Item */
- F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
- &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
- /* - sRBID */
- srbs_toBeReleased_item->sRBID = 2L;
+ srbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
+ srbs_toBeReleased_item_ies->criticality = F1AP_Criticality_ignore;
+ srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
+ /* 9.1 SRBs_ToBeReleased_Item */
+ F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
+ &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
+ /* - sRBID */
+ srbs_toBeReleased_item->sRBID = 2L;
+ }
}
- /* mandatory */
- /* c15. DRBs_ToBeReleased_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
- ie15->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
- ie15->criticality = F1AP_Criticality_reject;
- ie15->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
+ /* optional */
+ if(0){
+ /* c15. DRBs_ToBeReleased_List */
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
+ ie15->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
+ ie15->criticality = F1AP_Criticality_reject;
+ ie15->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
+ for (int i=0; i<1; i++) {
+ //
+ asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
F1AP_DRBs_ToBeReleased_ItemIEs_t, drbs_toBeReleased_item_ies);
- drbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
- drbs_toBeReleased_item_ies->criticality = F1AP_Criticality_reject;
- drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
- /* 14.1 SRBs_ToBeReleased_Item */
- F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
- &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
- /* dRBID */
- drbs_toBeReleased_item->dRBID = 30L;
+ drbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
+ drbs_toBeReleased_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
+ /* 14.1 SRBs_ToBeReleased_Item */
+ F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
+ &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
+ /* dRBID */
+ drbs_toBeReleased_item->dRBID = 30L;
+ }
}
/* encode */
@@ -1346,7 +1639,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT_MODIFICATION REQUEST\n");
return -1;
}
-
+ f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
return 0;
}
@@ -1354,7 +1647,130 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
- AssertFatal(1==0,"Not implemented yet\n");
+
+ MessageDef *msg_p;
+ F1AP_UEContextModificationResponse_t *container;
+ F1AP_UEContextModificationResponseIEs_t *ie;
+ DevAssert(pdu);
+ msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
+ f1ap_ue_context_setup_t *f1ap_ue_context_modification_resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
+ container = &pdu->choice.successfulOutcome->value.choice.UEContextModificationResponse;
+ int i;
+
+ /* GNB_CU_UE_F1AP_ID */
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+ f1ap_ue_context_modification_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
+
+ LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_CU_ue_id);
+
+ /* GNB_DU_UE_F1AP_ID */
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+ f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
+
+ LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
+
+ f1ap_ue_context_modification_resp->rnti =
+ f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
+
+ // DUtoCURRCInformation
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, false);
+ if(ie!=NULL){
+ f1ap_ue_context_modification_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1, sizeof(du_to_cu_rrc_information_t));
+ f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+
+ memcpy(f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+ f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
+ }
+
+ // DRBs_SetupMod_List
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List, false);
+ if(ie!=NULL){
+ f1ap_ue_context_modification_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_SetupMod_List.list.count;
+ f1ap_ue_context_modification_resp->drbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_to_be_setup_length,
+ sizeof(f1ap_drb_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_resp->drbs_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
+ for (i = 0; i < f1ap_ue_context_modification_resp->drbs_to_be_setup_length; ++i) {
+ f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_to_be_setup[i];
+ F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item_p;
+ drbs_setupmod_item_p = &((F1AP_DRBs_SetupMod_ItemIEs_t *)ie->value.choice.DRBs_SetupMod_List.list.array[i])->value.choice.DRBs_SetupMod_Item;
+ drb_p->drb_id = drbs_setupmod_item_p->dRBID;
+ // TODO in the following, assume only one UP UL TNL is present.
+ // this matches/assumes OAI CU/DU implementation, can be up to 2!
+ drb_p->up_dl_tnl_length = 1;
+ AssertFatal(drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
+ "no DL UP TNL Information in DRBs to be Setup list\n");
+ F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
+ F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
+ BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
+ OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
+ GtpuUpdateTunnelOutgoingTeid(getCxt(CUtype, instance)->gtpInst,
+ f1ap_ue_context_modification_resp->rnti,
+ (ebi_t)drbs_setupmod_item_p->dRBID,
+ drb_p->up_dl_tnl[0].teid);
+ }
+ }
+ // SRBs_FailedToBeSetupMod_List
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List, false);
+ if(ie!=NULL){
+ f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetupMod_List.list.count;
+ f1ap_ue_context_modification_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length,
+ sizeof(f1ap_rb_failed_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
+ for (i = 0; i < f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length; ++i) {
+ f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_failed_to_be_setup[i];
+ srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.SRBs_FailedToBeSetupMod_List.list.array[i])->sRBID;
+ }
+
+ }
+ // DRBs_FailedToBeSetupMod_List
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List, false);
+ if(ie!=NULL){
+ f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetupMod_List.list.count;
+ f1ap_ue_context_modification_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length,
+ sizeof(f1ap_rb_failed_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
+ for (i = 0; i < f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length; ++i) {
+ f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_failed_to_be_setup[i];
+ drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.DRBs_FailedToBeSetupMod_List.list.array[i])->dRBID;
+ }
+ }
+
+ // SCell_FailedtoSetupMod_List
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List, false);
+ if(ie!=NULL){
+ LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetupMod_List \n");
+ }
+
+ // SRBs_Setup_List
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List, false);
+ if(ie!=NULL){
+ f1ap_ue_context_modification_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_SetupMod_List.list.count;
+ f1ap_ue_context_modification_resp->srbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_to_be_setup_length,
+ sizeof(f1ap_srb_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_resp->srbs_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
+ for (i = 0; i < f1ap_ue_context_modification_resp->srbs_to_be_setup_length; ++i) {
+ f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_to_be_setup[i];
+ F1AP_SRBs_SetupMod_Item_t *srbs_setup_item_p;
+ srbs_setup_item_p = &((F1AP_SRBs_SetupMod_ItemIEs_t *)ie->value.choice.SRBs_SetupMod_List.list.array[i])->value.choice.SRBs_SetupMod_Item;
+ srb_p->srb_id = srbs_setup_item_p->sRBID;
+ srb_p->lcid = srbs_setup_item_p->lCID;
+ }
+ }
+
+ itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+ return 0;
}
int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.h b/openair2/F1AP/f1ap_cu_ue_context_management.h
index 09af51ec54..87563e97b1 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.h
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.h
@@ -72,7 +72,8 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
/*
* UE Context Modification (gNB-CU initiated)
*/
-int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance);
+int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
+ f1ap_ue_context_setup_t *f1ap_ue_context_modification_req);
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
diff --git a/openair2/F1AP/f1ap_decoder.c b/openair2/F1AP/f1ap_decoder.c
index 6ebf1cc16d..60b3f94310 100644
--- a/openair2/F1AP/f1ap_decoder.c
+++ b/openair2/F1AP/f1ap_decoder.c
@@ -78,6 +78,10 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu) {
case F1AP_ProcedureCode_id_UEContextSetup:
LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__);
break;
+
+ case F1AP_ProcedureCode_id_UEContextModification:
+ LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__);
+ break;
// case F1AP_ProcedureCode_id_InitialContextSetup:
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
@@ -123,6 +127,10 @@ static int f1ap_decode_successful_outcome(F1AP_F1AP_PDU_t *pdu) {
LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__);
break;
+ case F1AP_ProcedureCode_id_UEContextModification:
+ LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__);
+ break;
+
default:
LOG_E(F1AP,"Unknown procedure ID (%d) for successfull outcome message\n",
(int)pdu->choice.successfulOutcome->procedureCode);
diff --git a/openair2/F1AP/f1ap_default_values.h b/openair2/F1AP/f1ap_default_values.h
index 91a1179624..7c64614f50 100644
--- a/openair2/F1AP/f1ap_default_values.h
+++ b/openair2/F1AP/f1ap_default_values.h
@@ -40,7 +40,7 @@
#define ENB_NAME "Eurecom ENB"
#define ENB_NAME_FORMAT (ENB_NAME" %u")
-#define F1AP_PORT_NUMBER (30923)
+#define F1AP_PORT_NUMBER (38472)
#define F1AP_SCTP_PPID (62)
#endif /* F1AP_DEFAULT_VALUES_H_ */
diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c
index 6d4757be6f..367b71fed5 100644
--- a/openair2/F1AP/f1ap_du_interface_management.c
+++ b/openair2/F1AP/f1ap_du_interface_management.c
@@ -172,7 +172,20 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity);
// // /* - CHOICE NR-MODE-Info */
F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
+ F1AP_ProtocolExtensionContainer_154P34_t *p_154P34=calloc(1,sizeof(* p_154P34));
+ servedPLMN_item->iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p_154P34;
+ asn1cSequenceAdd(p_154P34->list, F1AP_ServedPLMNs_ItemExtIEs_t , served_plmns_itemExtIEs);
+ served_plmns_itemExtIEs->criticality = F1AP_Criticality_ignore;
+ served_plmns_itemExtIEs->id = F1AP_ProtocolIE_ID_id_TAISliceSupportList;
+ served_plmns_itemExtIEs->extensionValue.present = F1AP_ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+ F1AP_SliceSupportList_t *slice_support_list = &served_plmns_itemExtIEs->extensionValue.choice.SliceSupportList;
+ asn1cSequenceAdd(slice_support_list->list, F1AP_SliceSupportItem_t, SliceSupport_item);
+ INT8_TO_OCTET_STRING(1,&SliceSupport_item->sNSSAI.sST);
+ asn1cCalloc(SliceSupport_item->sNSSAI.sD, tmp);
+ INT24_TO_OCTET_STRING(10203,tmp);
+ //INT24_TO_OCTET_STRING(1,tmp);
+
if (f1ap_req(false, instance)->fdd_flag) { // FDD
nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD;
asn1cCalloc(nR_Mode_Info->choice.fDD, fDD_Info);
diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
index 90ea324a28..a9f82f42b3 100644
--- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c
+++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
@@ -810,6 +810,13 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
sdu2P,
sdu2_lenP);
}
+ /* mandatory */
+ /* c6. Transaction ID (integer value) */
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie6);
+ ie6->id = F1AP_ProtocolIE_ID_id_TransactionID;
+ ie6->criticality = F1AP_Criticality_ignore;
+ ie6->value.present = F1AP_F1SetupRequestIEs__value_PR_TransactionID;
+ ie6->value.choice.TransactionID = F1AP_get_next_transaction_identifier(f1ap_req(false, instanceP)->gNB_DU_id, f1ap_req(false, instanceP)->gNB_DU_id);
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
diff --git a/openair2/F1AP/f1ap_du_task.c b/openair2/F1AP/f1ap_du_task.c
index c8cfadb999..f8cf216220 100644
--- a/openair2/F1AP/f1ap_du_task.c
+++ b/openair2/F1AP/f1ap_du_task.c
@@ -126,7 +126,7 @@ void *F1AP_DU_task(void *arg) {
LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
f1ap_setup_req_t *msgSetup=&F1AP_SETUP_REQ(msg);
createF1inst(false, myInstance, msgSetup);
- getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address,
+ getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address, //"172.21.6.9", //"172.21.10.9",//"172.21.9.5", //msgSetup->CU_f1_ip_address.ipv4_address, //"192.168.18.91"
msgSetup->CUport,
msgSetup->DU_f1_ip_address.ipv4_address,
msgSetup->DUport);
@@ -175,7 +175,7 @@ void *F1AP_DU_task(void *arg) {
break;
case F1AP_UL_RRC_MESSAGE: // to rrc
- LOG_I(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n");
+ LOG_D(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n");
if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_DU) {
DU_send_UL_NR_RRC_MESSAGE_TRANSFER(myInstance,
@@ -191,6 +191,11 @@ void *F1AP_DU_task(void *arg) {
DU_send_UE_CONTEXT_SETUP_RESPONSE(myInstance, &F1AP_UE_CONTEXT_SETUP_RESP(msg));
break;
+ case F1AP_UE_CONTEXT_MODIFICATION_RESP:
+ LOG_I(F1AP, "DU task received itti message from RRC for F1AP_UE_CONTEXT_MODIFICATION_RESP message generation \n");
+ DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(myInstance, &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg));
+ break;
+
case F1AP_UE_CONTEXT_RELEASE_REQ: // from MAC
LOG_I(F1AP, "DU Task Received F1AP_UE_CONTEXT_RELEASE_REQ\n");
DU_send_UE_CONTEXT_RELEASE_REQUEST(myInstance,
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index e19f077592..6dbe820465 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -131,6 +131,19 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_req->cellULConfigured = NULL;
}
+ F1AP_UEContextSetupRequestIEs_t *ieCuRrcInfo;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieCuRrcInfo, container,
+ F1AP_ProtocolIE_ID_id_CUtoDURRCInformation, false);
+ if(ieCuRrcInfo!=NULL){
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information = (cu_to_du_rrc_information_t *)calloc(1,sizeof(cu_to_du_rrc_information_t));
+ if(ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList!=NULL){
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = (uint8_t *)calloc(1,ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size);
+ memcpy(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->buf, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size);
+ f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size;
+ LOG_I(F1AP, "Size f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length: %d \n", f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+ }
+ }
+
/* DRB */
F1AP_UEContextSetupRequestIEs_t *ieDrb;
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDrb, container,
@@ -218,17 +231,8 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
memcpy(f1ap_ue_context_setup_req->rrc_container,
ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+ f1ap_ue_context_setup_req->rrc_container_length = ieRRC->value.choice.RRCContainer.size;
// AssertFatal(0, "check configuration, send to appropriate handler\n");
- protocol_ctxt_t ctxt;
- // decode RRC Container and act on the message type
- //FIXME
- //rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
- ctxt.instance = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
- mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
- memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
- du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
} else {
LOG_E(F1AP, " RRCContainer in UEContextSetupRequestIEs size id 0\n");
}
@@ -245,7 +249,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
return 0;
}
-int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req) {
+int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) {
F1AP_F1AP_PDU_t pdu= {0};
F1AP_UEContextSetupResponse_t *out;
uint8_t *buffer=NULL;
@@ -264,41 +268,42 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
- ie1->value.choice.GNB_CU_UE_F1AP_ID = req->gNB_CU_ue_id;
+ ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
- ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti);
+ ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
+
/* mandatory */
/* c3. DUtoCURRCInformation */
- //if (0) {
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3);
- ie3->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
- ie3->criticality = F1AP_Criticality_reject;
- ie3->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
- {
- /* cellGroupConfig */
- OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)req->du_to_cu_rrc_information,
- req->du_to_cu_rrc_information_length);
+ if(resp->du_to_cu_rrc_information){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3);
+ ie3->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
+ ie3->criticality = F1AP_Criticality_reject;
+ ie3->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
+ if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+ /* cellGroupConfig */
+ OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
+ resp->du_to_cu_rrc_information->cellGroupConfig_length);
+ }
/* OPTIONAL */
/* measGapConfig */
- if (0) {
- asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.measGapConfig, tmp);
- OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
+ if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
+ OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
+ resp->du_to_cu_rrc_information->measGapConfig_length);
}
/* OPTIONAL */
/* requestedP_MaxFR1 */
- if (0) {
- asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, tmp);
- OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
+ if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
+ OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
+ resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
}
}
- //}
/* optional */
/* c4. C_RNTI */
@@ -308,7 +313,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie4->criticality = F1AP_Criticality_ignore;
ie4->value.present = F1AP_UEContextSetupResponseIEs__value_PR_C_RNTI;
//C_RNTI_TO_BIT_STRING(rntiP, &ie->value.choice.C_RNTI);
- ie4->value.choice.C_RNTI=req->rnti;
+ ie4->value.choice.C_RNTI=resp->rnti;
LOG_E(F1AP,"RNTI to code!\n");
}
@@ -335,46 +340,48 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
/* mandatory */
/* c7. DRBs_Setup_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7);
- ie7->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_List;
- ie7->criticality = F1AP_Criticality_ignore;
- ie7->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
-
- for (int i=0; i< req->drbs_to_be_setup_length; i++) {
- //
- asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
- F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
- drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
- drbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
- drbs_setup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
- /* 7.1 DRBs_Setup_Item */
- /* ADD */
- F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item;
- /* dRBID */
- drbs_setup_item->dRBID = req->drbs_to_be_setup[i].drb_id;
-
- /* OPTIONAL */
- /* lCID */
- //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t));
- //drbs_setup_item.lCID = 1L;
-
- for (int j=0; jdrbs_to_be_setup[i].up_dl_tnl_length; j++) {
+ if(resp->drbs_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7);
+ ie7->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_List;
+ ie7->criticality = F1AP_Criticality_ignore;
+ ie7->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
+ for (int i=0; i< resp->drbs_to_be_setup_length; i++) {
+ //
+ asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
+ F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
+ drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
+ drbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
+ drbs_setup_item_ies->value.present = F1AP_DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
+ /* 7.1 DRBs_Setup_Item */
/* ADD */
- asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
+ F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item;
+ /* dRBID */
+ drbs_setup_item->dRBID = resp->drbs_to_be_setup[i].drb_id;
+
+ /* OPTIONAL */
+ /* lCID */
+ //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t));
+ //drbs_setup_item.lCID = 1L;
+
+ for (int j=0; jdrbs_to_be_setup[i].up_dl_tnl_length; j++) {
+ /* ADD */
+ asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
- dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- /* gTPTunnel */
- asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
- /* transportLayerAddress */
- struct sockaddr_in addr= {0};
- inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
- &addr.sin_addr.s_addr);
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
- &gTPTunnel->transportLayerAddress);
- /* gTP_TEID */
- INT32_TO_OCTET_STRING(req->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
- } // for j
- } // for i
+ dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ /* gTPTunnel */
+ asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
+ /* transportLayerAddress */
+ struct sockaddr_in addr= {0};
+ inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+ &addr.sin_addr.s_addr);
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
+ &gTPTunnel->transportLayerAddress);
+ /* gTP_TEID */
+ INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+ } // for j
+ } // for i
+
+ }
/* mandatory */
/* c8. SRBs_FailedToBeSetup_List */
@@ -387,7 +394,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
for (int i=0; i<1; i++) {
//
asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list,
- F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
+ F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
srbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item;
srbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
@@ -524,12 +531,13 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
/* mandatory */
/* c11. SRBs_Setup_List */
+ if(resp->srbs_to_be_setup_length > 0){
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie11);
ie11->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_List;
ie11->criticality = F1AP_Criticality_ignore;
ie11->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SRBs_Setup_List;
- for (int i=0; i< req->srbs_to_be_setup_length; i++) {//
+ for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list,
F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies);
srbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item;
@@ -539,7 +547,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
/* ADD */
F1AP_SRBs_Setup_Item_t *srbs_setup_item=&srbs_setup_item_ies->value.choice.SRBs_Setup_Item;
/* sRBID */
- srbs_setup_item->sRBID = req->srbs_to_be_setup[i].srb_id;
+ srbs_setup_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
+ }
}
/* Optional */
@@ -581,6 +590,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
getCxt(false, instance)->default_sctp_stream_id);
return 0;
}
+
int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance) {
AssertFatal(1==0,"Not implemented yet\n");
}
@@ -658,7 +668,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
getCxt(false, instance)->default_sctp_stream_id);
return 0;
}
-int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
+/*int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
@@ -667,14 +677,14 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
protocol_ctxt_t ctxt;
DevAssert(pdu);
container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
- /* GNB_CU_UE_F1AP_ID */
+ // GNB_CU_UE_F1AP_ID
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
ctxt.instance = instance;
ctxt.module_id = instance;
ctxt.enb_flag = 1;
- /* GNB_DU_UE_F1AP_ID */
+ // GNB_DU_UE_F1AP_ID
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
@@ -701,13 +711,14 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
}
}
}
- /* We don't need the Cause */
- /* Optional RRC Container: if present, send to UE */
+
+ // We don't need the Cause
+ // Optional RRC Container: if present, send to UE
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_RRCContainer, false);
if (ie && !UE_out_of_sync) {
- /* RRC message and UE is reachable, send message */
+ // RRC message and UE is reachable, send message
const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size;
mem_block_t *pdu_p = NULL;
pdu_p = get_free_mem_block(sdu_len, __func__);
@@ -758,8 +769,8 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
if (ue_context_p && !UE_out_of_sync) {
- /* UE exists and is in sync so we start a timer before releasing the
- * connection */
+ // UE exists and is in sync so we start a timer before releasing the
+ // connection
pthread_mutex_lock(&rrc_release_freelist);
for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
@@ -783,19 +794,198 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
pthread_mutex_unlock(&rrc_release_freelist);
ue_context_p->ue_context.ue_release_timer_s1 = 0;
} else if (ue_context_p && UE_out_of_sync) {
- /* UE exists and is out of sync, drop the connection */
+ // UE exists and is out of sync, drop the connection
mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti);
} else {
LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti);
}
- /* TODO send this once the connection has really been released */
+ // TODO send this once the connection has really been released
+ f1ap_ue_context_release_cplt_t cplt;
+ cplt.rnti = ctxt.rnti;
+ DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
+ return 0;
+ }
+}*/
+
+
+int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ F1AP_F1AP_PDU_t *pdu) {
+ F1AP_UEContextReleaseCommand_t *container;
+ F1AP_UEContextReleaseCommandIEs_t *ie;
+ protocol_ctxt_t ctxt;
+
+ /* ITTI message to NR-RRC for the case of gNB-DU */
+ MessageDef *msg_p; // message to NR-RRC
+ msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
+ f1ap_ue_context_release_req_t *f1ap_ue_context_release_cmd = &F1AP_UE_CONTEXT_RELEASE_CMD(msg_p);
+
+
+ DevAssert(pdu);
+ container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
+ // GNB_CU_UE_F1AP_ID
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+ if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){
+ f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
+ }
+ else{
+ ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
+ ctxt.instance = instance;
+ ctxt.module_id = instance;
+ ctxt.enb_flag = 1;
+ }
+ // GNB_DU_UE_F1AP_ID
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+ const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
+ ie->value.choice.GNB_DU_UE_F1AP_ID);
+ if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){
+ AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti,
+ "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
+ rnti, f1ap_ue_context_release_cmd->rnti);
+ }
+ else{
+ AssertFatal(ctxt.rnti == rnti,
+ "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
+ rnti, ctxt.rnti);
+ }
+ int UE_out_of_sync = 0;
+
+ if(RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU){
+ for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
+ if (RC.mac[instance]->UE_info.active[n] == TRUE
+ && rnti == UE_RNTI(instance, n)) {
+ UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync;
+ break;
+ }
+ }
+ }
+
+ // We don't need the Cause
+ // Optional RRC Container: if present, send to UE
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_RRCContainer, false);
+
+ if (ie && !UE_out_of_sync && RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU) {
+ // RRC message and UE is reachable, send message
+ const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size;
+ mem_block_t *pdu_p = NULL;
+ pdu_p = get_free_mem_block(sdu_len, __func__);
+ memcpy(&pdu_p->data[0], ie->value.choice.RRCContainer.buf, sdu_len);
+ rlc_op_status_t rlc_status = rlc_data_req(&ctxt
+ , 1
+ , MBMS_FLAG_NO
+ , 1 // SRB 1 correct?
+ , 0
+ , 0
+ , sdu_len
+ , pdu_p
+ ,NULL
+ ,NULL
+ );
+
+ switch (rlc_status) {
+ case RLC_OP_STATUS_OK:
+ break;
+
+ case RLC_OP_STATUS_BAD_PARAMETER:
+ LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
+ break;
+
+ case RLC_OP_STATUS_INTERNAL_ERROR:
+ LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
+ break;
+
+ case RLC_OP_STATUS_OUT_OF_RESSOURCES:
+ LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
+ break;
+
+ default:
+ LOG_W(F1AP, "RLC returned an unknown status code after F1AP placed "
+ "the order to send some data (Status Code:%d)\n", rlc_status);
+ break;
+ }
+ }
+ else if(ie && RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
+ f1ap_ue_context_release_cmd->rrc_container = malloc(ie->value.choice.RRCContainer.size);
+ memcpy(f1ap_ue_context_release_cmd->rrc_container,
+ ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
+ }
+
+ if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+ F1AP_ProtocolIE_ID_id_Cause, true);
+ switch (ie->value.choice.Cause.present){
+ case F1AP_Cause_PR_radioNetwork:
+ LOG_W (F1AP, "UE context release command cause is due to radioNetwork with specific code: %ld\n",ie->value.choice.Cause.choice.radioNetwork);
+ f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
+ break;
+ case F1AP_Cause_PR_transport:
+ LOG_W (F1AP, "UE context release command cause is due to transport with specific code: %ld\n",ie->value.choice.Cause.choice.transport);
+ f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_TRANSPORT;
+ break;
+ case F1AP_Cause_PR_protocol:
+ LOG_W (F1AP, "UE context release command cause is due to protocol with specific code: %ld\n",ie->value.choice.Cause.choice.protocol);
+ f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_PROTOCOL;
+ break;
+ case F1AP_Cause_PR_misc:
+ LOG_W (F1AP, "UE context release command cause is misc with specific code: %ld \n",ie->value.choice.Cause.choice.misc);
+ f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_MISC;
+ break;
+ default:
+ LOG_W(F1AP, "Unknown cause for UE context release command\n");
+ break;
+
+ }
+ itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+ return 0;
+ } else {
+ struct rrc_eNB_ue_context_s *ue_context_p;
+ ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
+
+ if (ue_context_p && !UE_out_of_sync) {
+ // UE exists and is in sync so we start a timer before releasing the
+ // connection
+ pthread_mutex_lock(&rrc_release_freelist);
+
+ for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
+ if (rrc_release_info.RRC_release_ctrl[release_num].flag == 0) {
+ if (ue_context_p->ue_context.ue_release_timer_s1 > 0)
+ rrc_release_info.RRC_release_ctrl[release_num].flag = 1;
+ else
+ rrc_release_info.RRC_release_ctrl[release_num].flag = 2;
+
+ rrc_release_info.RRC_release_ctrl[release_num].rnti = ctxt.rnti;
+ LOG_D(F1AP, "add rrc_release_info RNTI %x\n", ctxt.rnti);
+ // TODO: how to provide the correct MUI?
+ rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui = 0;
+ rrc_release_info.num_UEs++;
+ LOG_D(RRC,"Generate DLSCH Release send: index %d rnti %x mui %d flag %d \n",release_num,
+ ctxt.rnti, 0, rrc_release_info.RRC_release_ctrl[release_num].flag);
+ break;
+ }
+ }
+
+ pthread_mutex_unlock(&rrc_release_freelist);
+ ue_context_p->ue_context.ue_release_timer_s1 = 0;
+ } else if (ue_context_p && UE_out_of_sync) {
+ // UE exists and is out of sync, drop the connection
+ mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti);
+ } else {
+ LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti);
+ }
+
+ // TODO send this once the connection has really been released
f1ap_ue_context_release_cplt_t cplt;
cplt.rnti = ctxt.rnti;
DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
return 0;
}
}
+
int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
f1ap_ue_context_release_cplt_t *cplt) {
F1AP_F1AP_PDU_t pdu= {0};
@@ -890,10 +1080,160 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
- AssertFatal(1==0,"Not implemented yet\n");
+
+ MessageDef *msg_p; // message to RRC
+ F1AP_UEContextModificationRequest_t *container;
+ int i;
+ DevAssert(pdu);
+ msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ);
+ f1ap_ue_context_setup_t *f1ap_ue_context_modification_req = &F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
+ container = &pdu->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+
+ /* mandatory */
+ /* GNB_CU_UE_F1AP_ID */
+ F1AP_UEContextModificationRequestIEs_t *ieCU;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieCU, container,
+ F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+ f1ap_ue_context_modification_req->gNB_CU_ue_id = ieCU->value.choice.GNB_CU_UE_F1AP_ID;
+
+ /* mandatory */
+ /* GNB_DU_UE_F1AP_ID */
+ F1AP_UEContextModificationRequestIEs_t *ieDU_UE;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container,
+ F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+ f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
+ f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id);
+
+ if(f1ap_ue_context_modification_req->rnti<0)
+ LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n");
+ else
+ LOG_I(F1AP, "Retrieved rnti is: %d \n", f1ap_ue_context_modification_req->rnti);
+
+ /* SRB */
+ F1AP_UEContextModificationRequestIEs_t *ieSrb;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieSrb, container,
+ F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List, false);
+
+ if(ieSrb != NULL) {
+ f1ap_ue_context_modification_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.count;
+ f1ap_ue_context_modification_req->srbs_to_be_setup = calloc(f1ap_ue_context_modification_req->srbs_to_be_setup_length,
+ sizeof(f1ap_srb_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_req->srbs_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n");
+
+ for (i = 0; i < f1ap_ue_context_modification_req->srbs_to_be_setup_length; ++i) {
+ f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_req->srbs_to_be_setup[i];
+ F1AP_SRBs_ToBeSetupMod_Item_t *srbs_tobesetupmod_item_p;
+ srbs_tobesetupmod_item_p = &((F1AP_SRBs_ToBeSetupMod_ItemIEs_t *)ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.array[i])->value.choice.SRBs_ToBeSetupMod_Item;
+ srb_p->srb_id = srbs_tobesetupmod_item_p->sRBID;
+ }
+ }
+
+ /* DRB */
+ F1AP_UEContextModificationRequestIEs_t *ieDrb;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDrb, container,
+ F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List, false);
+
+ if(ieDrb!=NULL) {
+ f1ap_ue_context_modification_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.count;
+ f1ap_ue_context_modification_req->drbs_to_be_setup = calloc(f1ap_ue_context_modification_req->drbs_to_be_setup_length,
+ sizeof(f1ap_drb_to_be_setup_t));
+ AssertFatal(f1ap_ue_context_modification_req->drbs_to_be_setup,
+ "could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
+
+ for (i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; ++i) {
+ f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_req->drbs_to_be_setup[i];
+ F1AP_DRBs_ToBeSetupMod_Item_t *drbs_tobesetupmod_item_p =
+ &((F1AP_DRBs_ToBeSetupMod_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.array[i])->value.choice.DRBs_ToBeSetupMod_Item;
+ drb_p->drb_id = drbs_tobesetupmod_item_p->dRBID;
+ /* TODO in the following, assume only one UP UL TNL is present.
+ * this matches/assumes OAI CU implementation, can be up to 2! */
+ drb_p->up_ul_tnl_length = 1;
+ AssertFatal(drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
+ "no UL UP TNL Information in DRBs to be Setup list\n");
+ F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
+ F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
+ BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
+ OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid);
+ // 3GPP assumes GTP-U is on port 2152, but OAI is configurable
+ drb_p->up_ul_tnl[0].port=getCxt(false,instance)->setupReq.CUport;
+
+ switch (drbs_tobesetupmod_item_p->rLCMode) {
+ case F1AP_RLCMode_rlc_am:
+ drb_p->rlc_mode = RLC_MODE_AM;
+ break;
+
+ default:
+ drb_p->rlc_mode = RLC_MODE_TM;
+ break;
+ }
+ if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) {
+ transport_layer_addr_t addr;
+ 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;
+ drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT,
+ f1ap_ue_context_modification_req->rnti,
+ drb_p->drb_id,
+ drb_p->drb_id,
+ drb_p->up_ul_tnl[0].teid,
+ addr,
+ drb_p->up_ul_tnl[0].port,
+ lteDURecvCb);
+ drb_p->up_dl_tnl_length++;
+ }
+ }
+ }
+ /* RRC Reconfiguration Complete indicator */
+ F1AP_UEContextModificationRequestIEs_t *ieReconf;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieReconf, container,
+ F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator, false);
+
+ if(ieReconf) {
+ switch(ieReconf->value.choice.RRCReconfigurationCompleteIndicator){
+ case F1AP_RRCReconfigurationCompleteIndicator_true:
+ f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_success;
+ break;
+
+ case F1AP_RRCReconfigurationCompleteIndicator_failure:
+ f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_failure;
+ break;
+ }
+ }
+
+ /* RRCContainer */
+ F1AP_UEContextModificationRequestIEs_t *ieRRC;
+ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieRRC, container,
+ F1AP_ProtocolIE_ID_id_RRCContainer, false);
+
+ if (ieRRC) {
+ /* correct here */
+ if ( ieRRC->value.choice.RRCContainer.size ) {
+ f1ap_ue_context_modification_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
+ memcpy(f1ap_ue_context_modification_req->rrc_container,
+ ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+ protocol_ctxt_t ctxt;
+ // decode RRC Container and act on the message type
+ ctxt.rnti = f1ap_ue_context_modification_req->rnti;
+ ctxt.instance = instance;
+ ctxt.module_id = instance;
+ ctxt.enb_flag = 1;
+ ctxt.eNB_index = instance;
+ mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
+ memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+ du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
+ } else {
+ LOG_E(F1AP, " RRCContainer in UEContextModificationRequestIEs size id 0\n");
+ }
+ } else {
+ LOG_W(F1AP, "can't find RRCContainer in UEContextModificationRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
+ }
+
+ itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+ return 0;
}
+
//void DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(F1AP_UEContextModificationResponse_t *UEContextModificationResponse) {
-int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
+int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) {
F1AP_F1AP_PDU_t pdu= {0};
F1AP_UEContextModificationResponse_t *out;
uint8_t *buffer=NULL;
@@ -912,14 +1252,14 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
- ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L;
+ ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
- ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L;
+ ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
/* optional */
/* c3. ResourceCoordinationTransferContainer */
@@ -934,184 +1274,205 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
/* optional */
/* c4. DUtoCURRCInformation */
- if (0) {
+ if(resp->du_to_cu_rrc_information!=NULL){
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie4);
ie4->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
ie4->criticality = F1AP_Criticality_reject;
ie4->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation;
- OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
+ if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+ /* cellGroupConfig */
+ OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
+ resp->du_to_cu_rrc_information->cellGroupConfig_length);
+ }
/* OPTIONAL */
- if (1) {
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie41);
- ie41->value.choice.DUtoCURRCInformation.measGapConfig = (F1AP_MeasGapConfig_t *)calloc(1, sizeof(F1AP_MeasGapConfig_t));
- OCTET_STRING_fromBuf( ie41->value.choice.DUtoCURRCInformation.measGapConfig, "asdsa1d32sa1d31asd31as",
- strlen("asdsa1d32sa1d31asd31as"));
+ /* measGapConfig */
+ if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
+ OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
+ resp->du_to_cu_rrc_information->measGapConfig_length);
+ }
+
+ /* OPTIONAL */
+ /* requestedP_MaxFR1 */
+ if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
+ OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
+ resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
}
}
- /* mandatory */
- /* c5. DRBs_SetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5);
- ie5->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List;
- ie5->criticality = F1AP_Criticality_reject;
- ie5->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list,
- F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupMod_item_ies);
- drbs_setupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item;
- drbs_setupMod_item_ies->criticality = F1AP_Criticality_reject;
- drbs_setupMod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
- /* 10.1 DRBs_SetupMod_Item */
- F1AP_DRBs_SetupMod_Item_t *drbs_setupMod_item=&drbs_setupMod_item_ies->value.choice.DRBs_SetupMod_Item;
- /* dRBID */
- drbs_setupMod_item->dRBID = 30L;
- /* DLTunnels_SetupMod_List */
- int maxnoofDLUPTNLInformation = 1; // 2;
+ /* optional */
+ /* c5. DRBs_Setup_List */
+ if(resp->drbs_to_be_setup_length > 0) {
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5);
+ ie5->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List;
+ ie5->criticality = F1AP_Criticality_ignore;
+ ie5->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
+ for (int i=0; i< resp->drbs_to_be_setup_length; i++) {
+ asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupmod_item_ies);
+ drbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item;
+ drbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore;
+ drbs_setupmod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
+ /* 7.1 DRBs_Setup_Item */
+ /* ADD */
+ F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item=&drbs_setupmod_item_ies->value.choice.DRBs_SetupMod_Item;
+ /* dRBID */
+ drbs_setupmod_item->dRBID = resp->drbs_to_be_setup[i].drb_id;
- for (int j=0; jvalue.choice.DRBs_SetupMod_List.list,
- F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
- dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,
- gTPTunnel);
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
- OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
- strlen("1204"));
- }
+ for (int j=0; jdrbs_to_be_setup[i].up_dl_tnl_length; j++) {
+ /* ADD */
+ asn1cSequenceAdd(drbs_setupmod_item->dLUPTNLInformation_ToBeSetup_List.list,
+ F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
+ dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ /* gTPTunnel */
+ asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
+ /* transportLayerAddress */
+ struct sockaddr_in addr= {0};
+ inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+ &addr.sin_addr.s_addr);
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
+ &gTPTunnel->transportLayerAddress);
+ /* gTP_TEID */
+ INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+ } // for j
+ } // for i
}
- /* mandatory */
+ /* optional */
/* c6. DRBs_Modified_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6);
- ie6->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_List;
- ie6->criticality = F1AP_Criticality_reject;
- ie6->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
+ if(resp->drbs_to_be_modified_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6);
+ ie6->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_List;
+ ie6->criticality = F1AP_Criticality_ignore;
+ ie6->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list,
- F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies);
- drbs_modified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item;
- drbs_modified_item_ies->criticality = F1AP_Criticality_reject;
- drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
- /* 13.1 SRBs_modified_Item */
- F1AP_DRBs_Modified_Item_t *drbs_modified_item=
- &drbs_modified_item_ies->value.choice.DRBs_Modified_Item;
- /* dRBID */
- drbs_modified_item->dRBID = 25L;
- /* ULTunnels_Modified_List */
- int maxnoofULTunnels = 1; // 2;
-
- for (int j=0; jdLUPTNLInformation_ToBeSetup_List.list,
- F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
- asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp);
- tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
- asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel);
- TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
- OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", strlen("1204"));
+ for (int i=0; idrbs_to_be_modified_length; i++) {
+ asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list,
+ F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies);
+ drbs_modified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item;
+ drbs_modified_item_ies->criticality = F1AP_Criticality_ignore;
+ drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
+ /* DRBs_modified_Item */
+ F1AP_DRBs_Modified_Item_t *drbs_modified_item= &drbs_modified_item_ies->value.choice.DRBs_Modified_Item;
+ /* dRBID */
+ drbs_modified_item->dRBID = resp->drbs_to_be_modified[i].drb_id;
+
+ /* ULTunnels_Modified_List */
+ for (int j=0; jdrbs_to_be_modified[i].up_dl_tnl_length; j++) {
+ /* DLTunnels_Modified_Item */
+ asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list,
+ F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
+ asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp);
+ tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+ asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel);
+ /* transportLayerAddress */
+ struct sockaddr_in addr= {0};
+ inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+ &addr.sin_addr.s_addr);
+ TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, &gTPTunnel->transportLayerAddress);
+ /* gTP_TEID */
+ INT32_TO_OCTET_STRING(resp->drbs_to_be_modified[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+ }
}
}
- /* mandatory */
+ /* optional */
/* c7. SRBs_FailedToBeSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7);
- ie7->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List;
- ie7->criticality = F1AP_Criticality_reject;
- ie7->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List;
+ if(resp->srbs_failed_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7);
+ ie7->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List;
+ ie7->criticality = F1AP_Criticality_reject;
+ ie7->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list,
- F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies);
- srbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item;
- srbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
- srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item;
- /* 9.1 SRBs_FailedToBeSetupMod_Item */
- F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item=
- &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item;
- /* - sRBID */
- srbs_failedToBeSetupMod_item->sRBID = 50L;
- asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp)
- tmp->present = F1AP_Cause_PR_radioNetwork;
- tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ for (int i=0; isrbs_to_be_setup_length; i++) {
+ asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list,
+ F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies);
+ srbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item;
+ srbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
+ srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item;
+ /* 9.1 SRBs_FailedToBeSetupMod_Item */
+ F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item=
+ &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item;
+ /* - sRBID */
+ srbs_failedToBeSetupMod_item->sRBID = resp->srbs_failed_to_be_setup[i].rb_id;
+ asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp)
+ tmp->present = F1AP_Cause_PR_radioNetwork;
+ tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ }
}
- /* mandatory */
+ /* optional */
/* c8. DRBs_FailedToBeSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8);
- ie8->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List;
- ie8->criticality = F1AP_Criticality_reject;
- ie8->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List;
+ if(resp->drbs_failed_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8);
+ ie8->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List;
+ ie8->criticality = F1AP_Criticality_reject;
+ ie8->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list,
- F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies);
- drbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item;
- drbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
- drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item;
- /* 10.1 DRBs_ToBeSetupMod_Item */
- F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item=
- &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item;
- /* dRBID */
- drbs_failedToBeSetupMod_item->dRBID = 30L;
- drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t));
- drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork;
- drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ for (int i=0; idrbs_failed_to_be_setup_length; i++) {
+ asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list,
+ F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies);
+ drbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item;
+ drbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item;
+ /* DRBs_FailedToBeSetupMod_Item */
+ F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item=
+ &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item;
+ /* dRBID */
+ drbs_failedToBeSetupMod_item->dRBID = resp->drbs_failed_to_be_setup[i].rb_id;
+ drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t));
+ drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork;
+ drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ }
}
- /* mandatory */
+ /* optional */
/* c9. SCell_FailedtoSetupMod_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9);
- ie9->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List;
- ie9->criticality = F1AP_Criticality_ignore;
- ie9->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List;
+ if(0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9);
+ ie9->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List;
+ ie9->criticality = F1AP_Criticality_ignore;
+ ie9->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list,
- F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies);
- scell_failedtoSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item;
- scell_failedtoSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
- scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item;
- /* 8.1 SCell_ToBeSetup_Item */
- F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
- /* - sCell_ID */
- addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]);
- asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp);
- tmp->present = F1AP_Cause_PR_radioNetwork;
- tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ for (int i=0; i<1; i++) {
+ asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list,
+ F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies);
+ scell_failedtoSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item;
+ scell_failedtoSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
+ scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item;
+ /* 8.1 SCell_ToBeSetup_Item */
+ F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
+ /* - sCell_ID */
+ addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]);
+ asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp);
+ tmp->present = F1AP_Cause_PR_radioNetwork;
+ tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ }
}
- /* mandatory */
+ /* optional */
/* c10. DRBs_FailedToBeModified_List */
- asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10);
- ie10->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List;
- ie10->criticality = F1AP_Criticality_reject;
- ie10->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List;
+ if(0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10);
+ ie10->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List;
+ ie10->criticality = F1AP_Criticality_reject;
+ ie10->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List;
- for (int i=0; i<1; i++) {
- //
- asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list,
- F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies);
- drbs_failedToBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item;
- drbs_failedToBeModified_item_ies->criticality = F1AP_Criticality_reject;
- drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item;
- /* 13.1 DRBs_FailedToBeModified_Item */
- F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item=
- &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ;
- /* dRBID */
- drbs_failedToBeModified_item->dRBID = 30L;
- asn1cCalloc(drbs_failedToBeModified_item->cause, tmp);
- tmp->present = F1AP_Cause_PR_radioNetwork;
- tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ for (int i=0; i<1; i++) {
+ asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list,
+ F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies);
+ drbs_failedToBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item;
+ drbs_failedToBeModified_item_ies->criticality = F1AP_Criticality_reject;
+ drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item;
+ /* 13.1 DRBs_FailedToBeModified_Item */
+ F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item=
+ &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ;
+ /* dRBID */
+ drbs_failedToBeModified_item->dRBID = 30L;
+ asn1cCalloc(drbs_failedToBeModified_item->cause, tmp);
+ tmp->present = F1AP_Cause_PR_radioNetwork;
+ tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+ }
}
// /* */
@@ -1162,6 +1523,28 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
}
}
}
+ /* optional */
+ /* c12. SRBs_Setup_List */
+ if(resp->srbs_to_be_setup_length > 0){
+ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie12);
+ ie12->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List;
+ ie12->criticality = F1AP_Criticality_ignore;
+ ie12->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List;
+
+ for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
+ asn1cSequenceAdd(ie12->value.choice.SRBs_SetupMod_List.list,
+ F1AP_SRBs_SetupMod_ItemIEs_t, srbs_setupmod_item_ies);
+ srbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_Item;
+ srbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore;
+ srbs_setupmod_item_ies->value.present = F1AP_SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item;
+ /* 11.1 SRBs_Setup_Item */
+ /* ADD */
+ F1AP_SRBs_SetupMod_Item_t *srbs_setupmod_item=&srbs_setupmod_item_ies->value.choice.SRBs_SetupMod_Item;
+ /* sRBID */
+ srbs_setupmod_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
+ srbs_setupmod_item->lCID = resp->srbs_to_be_setup[i].srb_id;
+ }
+ }
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
@@ -1169,9 +1552,10 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
return -1;
}
- //f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
+ f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
return 0;
}
+
int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance) {
AssertFatal(1==0,"Not implemented yet\n");
}
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.h b/openair2/F1AP/f1ap_du_ue_context_management.h
index 82643fa933..acf74f69d7 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.h
+++ b/openair2/F1AP/f1ap_du_ue_context_management.h
@@ -74,7 +74,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
-int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance);
+int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp);
int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance);
diff --git a/openair2/F1AP/f1ap_encoder.c b/openair2/F1AP/f1ap_encoder.c
index e623e66536..b249f23cfe 100644
--- a/openair2/F1AP/f1ap_encoder.c
+++ b/openair2/F1AP/f1ap_encoder.c
@@ -33,7 +33,7 @@
#include "f1ap_common.h"
#include "f1ap_encoder.h"
-int asn1_encoder_xer_print = 1;
+int asn1_encoder_xer_print = 0;
int f1ap_encode_pdu(F1AP_F1AP_PDU_t *pdu, uint8_t **buffer, uint32_t *length) {
ssize_t encoded;
diff --git a/openair2/F1AP/f1ap_handlers.c b/openair2/F1AP/f1ap_handlers.c
index fec03bb0b9..0812a976f6 100644
--- a/openair2/F1AP/f1ap_handlers.c
+++ b/openair2/F1AP/f1ap_handlers.c
@@ -50,7 +50,7 @@ f1ap_message_processing_t f1ap_messages_processing[][3] = {
{ DU_handle_gNB_CU_CONFIGURATION_UPDATE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE }, /* gNBCUConfigurationUpdate */
{ DU_handle_UE_CONTEXT_SETUP_REQUEST, CU_handle_UE_CONTEXT_SETUP_RESPONSE, 0 }, /* UEContextSetup */
{ DU_handle_UE_CONTEXT_RELEASE_COMMAND, CU_handle_UE_CONTEXT_RELEASE_COMPLETE, 0 }, /* UEContextRelease */
- { 0, 0, 0 }, /* UEContextModification */
+ { DU_handle_UE_CONTEXT_MODIFICATION_REQUEST, CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE, 0 }, /* UEContextModification */
{ 0, 0, 0 }, /* UEContextModificationRequired */
{ 0, 0, 0 }, /* UEMobilityCommand */
{ CU_handle_UE_CONTEXT_RELEASE_REQUEST, 0, 0 }, /* UEContextReleaseRequest */
diff --git a/openair2/F1AP/f1ap_itti_messaging.c b/openair2/F1AP/f1ap_itti_messaging.c
index 21096a6518..e45edcc3a3 100644
--- a/openair2/F1AP/f1ap_itti_messaging.c
+++ b/openair2/F1AP/f1ap_itti_messaging.c
@@ -32,7 +32,7 @@ void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffe
sctp_data_req->buffer = buffer;
sctp_data_req->buffer_length = buffer_length;
sctp_data_req->stream = stream;
- LOG_I(F1AP, "Sending ITTI message to SCTP Task\n");
+ LOG_D(F1AP, "Sending ITTI message to SCTP Task\n");
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
}
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 21655a74d5..e6c5c8036a 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -1235,8 +1235,6 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
(NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l] == 3),"BAD MNC DIGIT LENGTH %d",
NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l]);
}
- 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(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(GNB_APP,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr);
@@ -1957,9 +1955,38 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
f1Setup->measurement_timing_information[k] = "0";
f1Setup->ranac[k] = 0;
f1Setup->mib[k] = rrc->carrier.MIB;
- f1Setup->sib1[k] = rrc->carrier.SIB1;
f1Setup->mib_length[k] = rrc->carrier.sizeof_MIB;
- f1Setup->sib1_length[k] = rrc->carrier.sizeof_SIB1;
+
+ NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
+
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_BCCH_DL_SCH_Message,
+ (void **)&bcch_message,
+ (const void *)rrc->carrier.SIB1,
+ rrc->carrier.sizeof_SIB1);
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(RRC,"SIB1 decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_BCCH_DL_SCH_Message, bcch_message, 1 );
+ exit(1);
+ }
+
+ NR_SIB1_t *bcch_SIB1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
+ f1Setup->sib1[k] = calloc(1,rrc->carrier.sizeof_SIB1);
+ asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_SIB1,
+ NULL,
+ (void *)bcch_SIB1,
+ f1Setup->sib1[k],
+ NR_MAX_SIB_LENGTH/8);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+
+ //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ LOG_I(NR_RRC, "SIB1 container to be integrated in F1 Setup request:\n");
+ xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1 );
+ //}
+ f1Setup->sib1_length[k] = (enc_rval.encoded+7)/8;
break;
}
}
@@ -2121,7 +2148,6 @@ void configure_gnb_du_mac(int inst) {
// LOG_I(GNB_APP,"Configuring MAC/L1 %d, carrier->sib2 %p\n", inst, &carrier->sib2->radioResourceConfigCommon);
LOG_I(GNB_APP,"Configuring gNB DU MAC/L1 %d \n", inst);
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 52dcbd3152..2ecc8f2e99 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -113,7 +113,6 @@ typedef enum {
#define GNB_CONFIG_STRING_REMOTE_S_PORTC "remote_s_portc"
#define GNB_CONFIG_STRING_LOCAL_S_PORTD "local_s_portd"
#define GNB_CONFIG_STRING_REMOTE_S_PORTD "remote_s_portd"
-#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET "ssb_SubcarrierOffset"
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1 "pdsch_AntennaPorts_N1"
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2 "pdsch_AntennaPorts_N2"
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP "pdsch_AntennaPorts_XP"
@@ -149,7 +148,6 @@ typedef enum {
{GNB_CONFIG_STRING_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \
-{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET, NULL, 0, iptr:NULL, defintval:31, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1, "horiz. log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2, "vert. log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP, "XP log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
@@ -179,20 +177,19 @@ typedef enum {
#define GNB_REMOTE_S_PORTC_IDX 11
#define GNB_LOCAL_S_PORTD_IDX 12
#define GNB_REMOTE_S_PORTD_IDX 13
-#define GNB_SSB_SUBCARRIEROFFSET_IDX 14
-#define GNB_PDSCH_ANTENNAPORTS_N1_IDX 15
-#define GNB_PDSCH_ANTENNAPORTS_N2_IDX 16
-#define GNB_PDSCH_ANTENNAPORTS_XP_IDX 17
-#define GNB_PUSCH_ANTENNAPORTS_IDX 18
-#define GNB_SIB1_TDA_IDX 19
-#define GNB_DO_CSIRS_IDX 20
-#define GNB_DO_SRS_IDX 21
-#define GNB_NRCELLID_IDX 22
-#define GNB_MINRXTXTIME_IDX 23
-#define GNB_ULPRBBLACKLIST_IDX 24
-#define GNB_UMONDEFAULTDRB_IDX 25
-#define GNB_FORCE256QAMOFF_IDX 26
-#define GNB_ENABLE_SDAP_IDX 27
+#define GNB_PDSCH_ANTENNAPORTS_N1_IDX 14
+#define GNB_PDSCH_ANTENNAPORTS_N2_IDX 15
+#define GNB_PDSCH_ANTENNAPORTS_XP_IDX 16
+#define GNB_PUSCH_ANTENNAPORTS_IDX 17
+#define GNB_SIB1_TDA_IDX 18
+#define GNB_DO_CSIRS_IDX 19
+#define GNB_DO_SRS_IDX 20
+#define GNB_NRCELLID_IDX 21
+#define GNB_MINRXTXTIME_IDX 22
+#define GNB_ULPRBBLACKLIST_IDX 23
+#define GNB_UMONDEFAULTDRB_IDX 24
+#define GNB_FORCE256QAMOFF_IDX 25
+#define GNB_ENABLE_SDAP_IDX 26
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
#define GNBPARAMS_CHECK { \
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index b0d41f317b..5ffccf28d3 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -343,7 +343,9 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10;
cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell;
- cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
+
+ // NSA -> take ssb offset from SCS
+ cfg->ssb_table.ssb_subcarrier_offset = absolute_diff%(12*scs_scaling);
switch (scc->ssb_PositionsInBurst->present) {
case 1 :
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
old mode 100755
new mode 100644
index 8b3f00af43..3bfeb29e2e
--- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
+++ b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
@@ -24,3 +24,4 @@
*/
long nr_get_Pcmax(module_id_t mod_id);
/** @}*/
+
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 0e043208e4..50ea7cdd34 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -2433,11 +2433,9 @@ int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){
// start the sr-prohibittimer : rel 9 and above
if (mac->scheduling_info.sr_ProhibitTimer > 0) { // timer configured
mac->scheduling_info.sr_ProhibitTimer--;
- mac->scheduling_info.
- sr_ProhibitTimer_Running = 1;
+ mac->scheduling_info.sr_ProhibitTimer_Running = 1;
} else {
- mac->scheduling_info.
- sr_ProhibitTimer_Running = 0;
+ mac->scheduling_info.sr_ProhibitTimer_Running = 0;
}
//mac->ul_active =1;
return (1); //instruct phy to signal SR
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 493a058e13..218b75b2e8 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -160,7 +160,7 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche
}
-void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
+void config_common(int Mod_idP, 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;
@@ -341,26 +341,22 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts
if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
scs_scaling = scs_scaling>>2;
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
- uint16_t sco = absolute_diff%(12*scs_scaling);
- // values of subcarrier offset larger than the limit only indicates CORESET for Type0-PDCCH CSS set is not present
- int ssb_SubcarrierOffset_limit = 0;
- int offset_scaling = 0; //15kHz
- if(frequency_range == FR1) {
- ssb_SubcarrierOffset_limit = 24;
- if (ssb_SubcarrierOffsetssb_config.scs_common.value;
- } else
- ssb_SubcarrierOffset_limit = 12;
- if (ssb_SubcarrierOffsetssb_SubcarrierOffset = absolute_diff%(12*scs_scaling);
+ int sco = 31; // no SIB1
+ if(get_softmodem_params()->sa) {
+ sco = RC.nrmac[Mod_idP]->ssb_SubcarrierOffset;
+ if(frequency_range == FR1)
+ sco <<= cfg->ssb_config.scs_common.value; // 38.211 section 7.4.3.1 in FR1 it is expresses in terms of 15kHz SCS
+ }
+
cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
cfg->num_tlv++;
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
cfg->num_tlv++;
- cfg->ssb_table.ssb_subcarrier_offset.value = ssb_SubcarrierOffset<ssb_table.ssb_subcarrier_offset.value = sco;
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
cfg->num_tlv++;
@@ -462,8 +458,7 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_S
return -1;
}
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<if_inst->sl_ahead;
sched_ctrl->rrc_processing_timer = (rrc_reconfiguration_delay<rnti, rrc_reconfiguration_delay);
@@ -471,7 +466,6 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_S
}
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
int pusch_AntennaPorts,
int sib1_tda,
@@ -486,19 +480,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
if (scc != NULL ) {
AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present);
- /* dimension UL_tti_req_ahead for number of slots in frame */
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- RC.nrmac[Mod_idP]->UL_tti_req_ahead[0] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t));
- AssertFatal(RC.nrmac[Mod_idP]->UL_tti_req_ahead[0],
- "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
- /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler
- * consider that scheduler runs sl_ahead: the first sl_ahead slots are
- * already "in the past" and thus we put frame 1 instead of 0! */
- for (int i = 0; i < n; ++i) {
- nfapi_nr_ul_tti_request_t *req = &RC.nrmac[Mod_idP]->UL_tti_req_ahead[0][i];
- req->SFN = i < (RC.nrmac[Mod_idP]->if_inst->sl_ahead-1);
- req->Slot = i;
- }
RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL =
calloc(n * MAX_BWP_SIZE, sizeof(uint16_t));
AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL,
@@ -509,7 +491,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
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,
num_pdsch_antenna_ports,
pusch_AntennaPorts,
scc);
@@ -523,7 +504,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
printf("Waiting for PHY_config_req\n");
}
}
- RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = ssb_SubcarrierOffset;
RC.nrmac[Mod_idP]->minRXTXTIMEpdsch = minRXTXTIMEpdsch;
NR_PHY_Config_t phycfg;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 385cf5af16..c87aa68f75 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -68,6 +68,8 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
NR_ServingCellConfigCommon_t *scc = gNB->common_channels->ServingCellConfigCommon;
const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
+ UL_tti_req_ahead_initialization(gNB, scc, num_slots, CC_idP);
+
nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0];
nfapi_nr_dl_tti_pdcch_pdu_rel15_t **pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t **)gNB->pdcch_pdu_idx[CC_idP];
nfapi_nr_ul_tti_request_t *future_ul_tti_req =
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 3cbffa608f..9941437e13 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -3074,3 +3074,20 @@ void schedule_nr_bwp_switch(module_id_t module_id,
}
}
}
+
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid) {
+
+ if(gNB->UL_tti_req_ahead[CCid]) return;
+
+ gNB->UL_tti_req_ahead[CCid] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t));
+ AssertFatal(gNB->UL_tti_req_ahead[CCid],
+ "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
+ /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler
+ * consider that scheduler runs sl_ahead: the first sl_ahead slots are
+ * already "in the past" and thus we put frame 1 instead of 0! */
+ for (int i = 0; i < n; ++i) {
+ nfapi_nr_ul_tti_request_t *req = &gNB->UL_tti_req_ahead[CCid][i];
+ req->SFN = i < (gNB->if_inst->sl_ahead-1);
+ req->Slot = i;
+ }
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index d64b9c43db..20057fab13 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -1903,7 +1903,7 @@ void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot)
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;
+ if (sched_ctrl->ul_failure==1 || sched_ctrl->rrc_processing_timer>0) 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;
@@ -1915,7 +1915,6 @@ void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot)
UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
pucch_Config = UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
}
-
else continue;
if (!pucch_Config->schedulingRequestResourceToAddModList)
continue;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index fe921a6d2a..ce276b079c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -36,6 +36,7 @@
#include
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
+extern void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 7911275f70..2229dc32f2 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -41,7 +41,6 @@ void mac_top_init_gNB(void);
void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
void config_common(int Mod_idP,
- int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc);
@@ -52,7 +51,6 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP,
uint32_t rrc_reconfiguration_delay);
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
int pusch_AntennaPorts,
int sib1_tda,
@@ -420,16 +418,6 @@ int get_ulscs(nfapi_nr_config_request_t *cfg);
int get_symbolsperslot(nfapi_nr_config_request_t *cfg);
-void config_nr_mib(int Mod_idP,
- int CC_idP,
- int p_gNBP,
- int subCarrierSpacingCommon,
- uint32_t ssb_SubcarrierOffset,
- int dmrs_TypeA_Position,
- uint32_t pdcch_ConfigSIB1,
- int cellBarred,
- int intraFreqReselection);
-
int nr_write_ce_dlsch_pdu(module_id_t module_idP,
const NR_UE_sched_ctrl_t *ue_sched_ctl,
unsigned char *mac_pdu,
@@ -526,6 +514,8 @@ int get_mcs_from_bler(const NR_bler_options_t *bler_options,
int max_mcs,
frame_t frame);
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid);
+
void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP);
size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp);
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index ea4b7e80c7..fc794ad169 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -274,9 +274,8 @@ static void do_pdcp_data_ind(
if (rb != NULL) {
rb->recv_pdu(rb, (char *)sdu_buffer->data, sdu_buffer_size);
} else {
- LOG_E(PDCP, "%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)\n",
+ LOG_E(PDCP, "%s:%d:%s: no RB found (rb_id %ld, srb_flag %d)\n",
__FILE__, __LINE__, __FUNCTION__, rb_id, srb_flagP);
- exit(1);
}
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
index fefe2fc77d..1883bbdd6c 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
@@ -77,14 +77,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_am(
ret->sn_modulus = 1 << ret->sn_field_length;
ret->window_size = ret->sn_modulus / 2;
- ret->common.recv_pdu = nr_rlc_entity_am_recv_pdu;
- ret->common.buffer_status = nr_rlc_entity_am_buffer_status;
- ret->common.generate_pdu = nr_rlc_entity_am_generate_pdu;
- ret->common.recv_sdu = nr_rlc_entity_am_recv_sdu;
- ret->common.set_time = nr_rlc_entity_am_set_time;
- ret->common.discard_sdu = nr_rlc_entity_am_discard_sdu;
- ret->common.reestablishment = nr_rlc_entity_am_reestablishment;
- ret->common.delete = nr_rlc_entity_am_delete;
+ ret->common.recv_pdu = nr_rlc_entity_am_recv_pdu;
+ ret->common.buffer_status = nr_rlc_entity_am_buffer_status;
+ ret->common.generate_pdu = nr_rlc_entity_am_generate_pdu;
+ ret->common.recv_sdu = nr_rlc_entity_am_recv_sdu;
+ ret->common.set_time = nr_rlc_entity_am_set_time;
+ ret->common.discard_sdu = nr_rlc_entity_am_discard_sdu;
+ ret->common.reestablishment = nr_rlc_entity_am_reestablishment;
+ ret->common.delete = nr_rlc_entity_am_delete;
+ ret->common.available_tx_space = nr_rlc_entity_am_available_tx_space;
ret->common.deliver_sdu = deliver_sdu;
ret->common.deliver_sdu_data = deliver_sdu_data;
@@ -127,14 +128,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_um(
ret->sn_modulus = 1 << ret->sn_field_length;
ret->window_size = ret->sn_modulus / 2;
- ret->common.recv_pdu = nr_rlc_entity_um_recv_pdu;
- ret->common.buffer_status = nr_rlc_entity_um_buffer_status;
- ret->common.generate_pdu = nr_rlc_entity_um_generate_pdu;
- ret->common.recv_sdu = nr_rlc_entity_um_recv_sdu;
- ret->common.set_time = nr_rlc_entity_um_set_time;
- ret->common.discard_sdu = nr_rlc_entity_um_discard_sdu;
- ret->common.reestablishment = nr_rlc_entity_um_reestablishment;
- ret->common.delete = nr_rlc_entity_um_delete;
+ ret->common.recv_pdu = nr_rlc_entity_um_recv_pdu;
+ ret->common.buffer_status = nr_rlc_entity_um_buffer_status;
+ ret->common.generate_pdu = nr_rlc_entity_um_generate_pdu;
+ ret->common.recv_sdu = nr_rlc_entity_um_recv_sdu;
+ ret->common.set_time = nr_rlc_entity_um_set_time;
+ ret->common.discard_sdu = nr_rlc_entity_um_discard_sdu;
+ ret->common.reestablishment = nr_rlc_entity_um_reestablishment;
+ ret->common.delete = nr_rlc_entity_um_delete;
+ ret->common.available_tx_space = nr_rlc_entity_um_available_tx_space;
ret->common.deliver_sdu = deliver_sdu;
ret->common.deliver_sdu_data = deliver_sdu_data;
@@ -158,14 +160,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_tm(
ret->tx_maxsize = tx_maxsize;
- ret->common.recv_pdu = nr_rlc_entity_tm_recv_pdu;
- ret->common.buffer_status = nr_rlc_entity_tm_buffer_status;
- ret->common.generate_pdu = nr_rlc_entity_tm_generate_pdu;
- ret->common.recv_sdu = nr_rlc_entity_tm_recv_sdu;
- ret->common.set_time = nr_rlc_entity_tm_set_time;
- ret->common.discard_sdu = nr_rlc_entity_tm_discard_sdu;
- ret->common.reestablishment = nr_rlc_entity_tm_reestablishment;
- ret->common.delete = nr_rlc_entity_tm_delete;
+ ret->common.recv_pdu = nr_rlc_entity_tm_recv_pdu;
+ ret->common.buffer_status = nr_rlc_entity_tm_buffer_status;
+ ret->common.generate_pdu = nr_rlc_entity_tm_generate_pdu;
+ ret->common.recv_sdu = nr_rlc_entity_tm_recv_sdu;
+ ret->common.set_time = nr_rlc_entity_tm_set_time;
+ ret->common.discard_sdu = nr_rlc_entity_tm_discard_sdu;
+ ret->common.reestablishment = nr_rlc_entity_tm_reestablishment;
+ ret->common.delete = nr_rlc_entity_tm_delete;
+ ret->common.available_tx_space = nr_rlc_entity_tm_available_tx_space;
ret->common.deliver_sdu = deliver_sdu;
ret->common.deliver_sdu_data = deliver_sdu_data;
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
index b9b638fe07..5cd3bee650 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
@@ -50,6 +50,8 @@ typedef struct nr_rlc_entity_t {
void (*delete)(struct nr_rlc_entity_t *entity);
+ int (*available_tx_space)(struct nr_rlc_entity_t *entity);
+
/* callbacks provided to the RLC module */
void (*deliver_sdu)(void *deliver_sdu_data, struct nr_rlc_entity_t *entity,
char *buf, int size);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
index 2382db267f..91e2bed11a 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
@@ -1910,3 +1910,9 @@ void nr_rlc_entity_am_delete(nr_rlc_entity_t *_entity)
clear_entity(entity);
free(entity);
}
+
+int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *_entity)
+{
+ nr_rlc_entity_am_t *entity = (nr_rlc_entity_am_t *)_entity;
+ return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
index 57ae1a3485..4c626c4826 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
@@ -99,5 +99,6 @@ void nr_rlc_entity_am_set_time(nr_rlc_entity_t *entity, uint64_t now);
void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
void nr_rlc_entity_am_reestablishment(nr_rlc_entity_t *_entity);
void nr_rlc_entity_am_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *entity);
#endif /* _NR_RLC_ENTITY_AM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
index 75408276d1..f85edbba0f 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
@@ -174,3 +174,9 @@ void nr_rlc_entity_tm_delete(nr_rlc_entity_t *_entity)
clear_entity(entity);
free(entity);
}
+
+int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *_entity)
+{
+ nr_rlc_entity_tm_t *entity = (nr_rlc_entity_tm_t *)_entity;
+ return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
index 7c8c7e40a0..7918703799 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
@@ -51,5 +51,6 @@ void nr_rlc_entity_tm_set_time(nr_rlc_entity_t *entity, uint64_t now);
void nr_rlc_entity_tm_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity);
void nr_rlc_entity_tm_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *entity);
#endif /* _NR_RLC_ENTITY_TM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
index b34a7dc894..5f2fd592a0 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
@@ -695,3 +695,9 @@ void nr_rlc_entity_um_delete(nr_rlc_entity_t *_entity)
clear_entity(entity);
free(entity);
}
+
+int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *_entity)
+{
+ nr_rlc_entity_um_t *entity = (nr_rlc_entity_um_t *)_entity;
+ return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
index 21063a1ea1..c40e72ada1 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
@@ -75,5 +75,6 @@ void nr_rlc_entity_um_set_time(nr_rlc_entity_t *entity, uint64_t now);
void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity);
void nr_rlc_entity_um_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *entity);
#endif /* _NR_RLC_ENTITY_UM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 7ba08aaa71..4bd4ea75fd 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -101,6 +101,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config
switch (rlc_config_pr){
case NR_RLC_Config_PR_um_Bi_Directional:
// RLC UM Bi-directional Bearer configuration
+ LOG_I(RLC, "RLC UM Bi-directional Bearer configuration selected \n");
rlc_Config->choice.um_Bi_Directional = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional));
rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength));
*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12;
@@ -213,10 +214,12 @@ tbs_size_t mac_rlc_data_req(
}
if (rb != NULL) {
+ LOG_D(RLC, "MAC PDU to get created for channel_idP:%d \n", channel_idP);
rb->set_time(rb, nr_rlc_current_time);
maxsize = tb_sizeP;
ret = rb->generate_pdu(rb, buffer_pP, maxsize);
} else {
+ LOG_D(RLC, "MAC PDU failed to get created for channel_idP:%d \n", channel_idP);
ret = 0;
}
@@ -394,6 +397,35 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
return RLC_OP_STATUS_OK;
}
+int nr_rlc_get_available_tx_space(
+ const rnti_t rntiP,
+ const logical_chan_id_t channel_idP)
+{
+ nr_rlc_ue_t *ue;
+ nr_rlc_entity_t *rb;
+ int ret;
+
+ nr_rlc_manager_lock(nr_rlc_ue_manager);
+ ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP);
+
+ switch (channel_idP) {
+ case 1 ... 3: rb = ue->srb[channel_idP - 1]; break;
+ case 4 ... 8: rb = ue->drb[channel_idP - 4]; break;
+ default: rb = NULL; break;
+ }
+
+ if (rb != NULL) {
+ ret = rb->available_tx_space(rb);
+ } else {
+ LOG_E(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
+ ret = -1;
+ }
+
+ nr_rlc_manager_unlock(nr_rlc_ue_manager);
+
+ return ret;
+}
+
int rlc_module_init(int enb_flag)
{
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
index 6b3c228163..92fbba9bec 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
@@ -46,4 +46,8 @@ void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerCo
void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr);
-void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig);
\ No newline at end of file
+void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig);
+
+int nr_rlc_get_available_tx_space(
+ const rnti_t rntiP,
+ const logical_chan_id_t channel_idP);
diff --git a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz
index 45e54651eb..53cea67c98 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test15.txt.gz b/openair2/LAYER2/nr_rlc/tests/test15.txt.gz
index ddb895d56f..61fa016634 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test15.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test15.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test8.txt.gz b/openair2/LAYER2/nr_rlc/tests/test8.txt.gz
index c20d43c63b..461ae1aeba 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test8.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test8.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test9.txt.gz b/openair2/LAYER2/nr_rlc/tests/test9.txt.gz
index 27590b7d71..938fcd6ddc 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test9.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test9.txt.gz differ
diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
index 2a6f00c13c..11ae770e3e 100644
--- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c
+++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
@@ -1065,3 +1065,15 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
sdu_sizeP,
sdu_pP, NULL, NULL);
}
+
+/* HACK to be removed: nr_rlc_get_available_tx_space is needed by
+ * openair3/ocp-gtpu/gtp_itf.cpp which is compiled in lte-softmodem
+ * so let's put a dummy nr_rlc_get_available_tx_space here
+ */
+int nr_rlc_get_available_tx_space(
+ const rnti_t rntiP,
+ const logical_chan_id_t channel_idP)
+{
+ abort();
+ return 0;
+}
diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c
index f63408259c..d86e32e561 100644
--- a/openair2/NETWORK_DRIVER/MESH/device.c
+++ b/openair2/NETWORK_DRIVER/MESH/device.c
@@ -198,7 +198,8 @@ int nas_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
// End debug information
netif_stop_queue(dev);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+ || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
netif_trans_update(dev);
#else
dev->trans_start = jiffies;
@@ -267,7 +268,8 @@ void nas_tx_timeout(struct net_device *dev)
printk("TX_TIMEOUT: begin\n");
// (struct nas_priv *)(dev->priv)->stats.tx_errors++;
(priv->stats).tx_errors++;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+ || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
netif_trans_update(dev);
#else
dev->trans_start = jiffies;
@@ -285,7 +287,8 @@ static const struct net_device_ops nasmesh_netdev_ops = {
.ndo_set_mac_address = NULL,
.ndo_set_config = nas_set_config,
.ndo_do_ioctl = nas_CTL_ioctl,
-#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1797 && LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0))
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0) \
+ || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403)
.extended.ndo_change_mtu = nas_change_mtu,
#else
.ndo_change_mtu = nas_change_mtu,
diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c
index 0ff9a73925..bf858a0005 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/device.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/device.c
@@ -239,7 +239,8 @@ int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP) {
// End debug information
netif_stop_queue(dev_pP);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+ || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
netif_trans_update(dev_pP);
#else
dev_pP->trans_start = jiffies;
@@ -315,7 +316,8 @@ void ue_ip_tx_timeout(struct net_device *dev_pP)
printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__);
// (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++;
(priv_p->stats).tx_errors++;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+ || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
netif_trans_update(dev_pP);
#else
dev_pP->trans_start = jiffies;
@@ -333,7 +335,7 @@ static const struct net_device_ops ue_ip_netdev_ops = {
.ndo_set_mac_address = ue_ip_set_mac_address,
.ndo_set_config = ue_ip_set_config,
.ndo_do_ioctl = NULL,
-#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797)
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403
.extended.ndo_change_mtu = ue_ip_change_mtu,
#else
.ndo_change_mtu = ue_ip_change_mtu,
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index b8b79f8399..b6f760a86a 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -66,17 +66,6 @@ queue_t nr_tx_req_queue;
queue_t nr_ul_dci_req_queue;
queue_t nr_ul_tti_req_queue;
-static slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
-
-//static int get_mcs_from_sinr(float sinr);
-//static int get_cqi_from_mcs(void);
-static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index);
-//static bool did_drop_transport_block(int slot, uint16_t rnti);
-static float get_bler_val(uint8_t mcs, int sinr);
-static bool should_drop_transport_block(int slot, uint16_t rnti);
-static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
-static inline bool is_channel_modeling(void);
-
void nrue_init_standalone_socket(int tx_port, int rx_port)
{
{
@@ -939,7 +928,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
return;
}
-static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request)
+void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request)
{
int count_sent = 0;
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
@@ -1343,245 +1332,3 @@ void RCconfig_nr_ue_L1(void) {
}
}
}
-
-/*
-static int get_mcs_from_sinr(float sinr)
-{
- if (sinr < (nr_bler_data[0].bler_table[0][0]))
- {
- LOG_D(NR_MAC, "The SINR found is smaller than first MCS table\n");
- return 0;
- }
-
- if (sinr > (nr_bler_data[NR_NUM_MCS-1].bler_table[nr_bler_data[NR_NUM_MCS-1].length - 1][0]))
- {
- LOG_D(NR_MAC, "The SINR found is larger than last MCS table\n");
- return NR_NUM_MCS-1;
- }
-
- for (int n = NR_NUM_MCS-1; n >= 0; n--)
- {
- CHECK_INDEX(nr_bler_data, n);
- float largest_sinr = (nr_bler_data[n].bler_table[nr_bler_data[n].length - 1][0]);
- float smallest_sinr = (nr_bler_data[n].bler_table[0][0]);
- if (sinr < largest_sinr && sinr > smallest_sinr)
- {
- LOG_D(NR_MAC, "The SINR found in MCS %d table\n", n);
- return n;
- }
- }
- LOG_E(NR_MAC, "Unable to get an MCS value.\n");
- abort();
-}
-*/
-
-/*
-static int get_cqi_from_mcs(void)
-{
- static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
- 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15};
- assert(NUM_ELEMENTS(mcs_to_cqi) == NR_NUM_MCS);
- int slot = 0;
- while (slot < NUM_NFAPI_SLOT)
- {
- if (slot_rnti_mcs[slot].latest)
- {
- int num_pdus = slot_rnti_mcs[slot].num_pdus;
- if (num_pdus <= 0)
- {
- LOG_E(NR_MAC, "%s: slot_rnti_mcs[%d].num_pdus = 0\n", __FUNCTION__, slot);
- abort();
- }
-
- CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
- int mcs = get_mcs_from_sinr(slot_rnti_mcs[slot].sinr);
- CHECK_INDEX(mcs_to_cqi, mcs);
- int cqi = mcs_to_cqi[mcs];
- LOG_D(NR_MAC, "SINR: %f -> MCS: %d -> CQI: %d\n", slot_rnti_mcs[slot].sinr, mcs, cqi);
- return cqi;
- }
- slot++;
- }
- LOG_E(NR_MAC, "Unable to get CQI value because no MCS found\n");
- abort();
-}
-*/
-
-static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index)
-{
- if (pdu == NULL)
- {
- LOG_E(NR_MAC,"PDU NULL\n");
- abort();
- }
-
- /* This function is executed for every pdsch pdu type in a dl_tti_request. We save
- the assocaited MCS and RNTI value for each. The 'index' passed in is a count of
- how many times we have called this function for a particular dl_tti_request. It
- allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/
- for (int i = 0; i < NUM_NFAPI_SLOT; i++)
- {
- slot_rnti_mcs[i].latest = false;
- }
-
- CHECK_INDEX(slot_rnti_mcs[slot].rnti, index);
- CHECK_INDEX(slot_rnti_mcs[slot].mcs, index);
- CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index);
- slot_rnti_mcs[slot].rnti[index] = pdu->rnti;
- slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0];
- slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0];
- slot_rnti_mcs[slot].drop_flag[index] = false;
- slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus
- slot_rnti_mcs[slot].latest = true;
- LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot);
-
- return;
-}
-
-/*
-static bool did_drop_transport_block(int slot, uint16_t rnti)
-{
- int num_pdus = slot_rnti_mcs[slot].num_pdus;
- if (num_pdus <= 0)
- {
- LOG_E(MAC, "Problem, the PDU size is <= 0. We dropped this packet\n");
- return true;
- }
- CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
- CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
- for (int n = 0; n < num_pdus; n++)
- {
- if (slot_rnti_mcs[slot].rnti[n] == rnti && slot_rnti_mcs[slot].drop_flag[n])
- {
- return true;
- }
- }
- return false;
-}
-*/
-
-static float get_bler_val(uint8_t mcs, int sinr)
-{
- // 4th col = dropped packets, 5th col = total packets
- float bler_val = 0.0;
- CHECK_INDEX(nr_bler_data, mcs);
- LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr,
- (int)(nr_bler_data[mcs].bler_table[0][0] * 10),
- (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)
- );
-
- if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10))
- {
- LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs);
- bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5];
- return bler_val;
- }
- if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10))
- {
- LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs);
- bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5];
- return bler_val;
- }
- // Loop through bler table to find sinr_index
- for (int i = 0; i < nr_bler_data[mcs].length; i++)
- {
- int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10);
- if (temp_sinr == sinr)
- {
- bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
- return bler_val;
- }
- // Linear interpolation when SINR is between indices
- if (temp_sinr > sinr)
- {
- float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5];
- float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
- LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2);
- return ((bler_val1 + bler_val2) / 2);
- }
- }
- LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n");
- abort();
-
-}
-
-static inline bool is_channel_modeling(void)
-{
- /* TODO: For now we enable channel modeling based on the node_number.
- Replace with a command line option to enable/disable channel modeling.
- The LTE UE will crash when channel modeling is conducted for NSA
- mode. It does not crash for LTE mode. We have not implemented channel
- modeling for NSA mode yet. For now, we ensure only do do channel modeling
- in LTE/NR mode. */
- return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa;
-}
-
-static bool should_drop_transport_block(int slot, uint16_t rnti)
-{
- if (!is_channel_modeling())
- {
- return false;
- }
-
- /* We want to avoid dropping setup messages because this would be pathological. */
- NR_UE_MAC_INST_t *mac = get_mac_inst(0);
- if (mac->ra.ra_state < RA_SUCCEEDED)
- {
- LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state);
- return false;
- }
-
- /* Get block error rate (bler_val) from table based on every saved
- MCS and SINR to be used as the cutoff rate for dropping packets.
- Generate random uniform vairable to compare against bler_val. */
- int num_pdus = slot_rnti_mcs[slot].num_pdus;
- assert(slot < 20 && slot >= 0);
- LOG_D(NR_MAC, "rnti: %x num_pdus %d state %d slot %u sinr %f\n",
- rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr);
- assert(num_pdus > 0);
- CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
- CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
- CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
- int n = 0;
- uint8_t mcs = 99;
- for (n = 0; n < num_pdus; n++)
- {
- if (slot_rnti_mcs[slot].rnti[n] == rnti)
- {
- mcs = slot_rnti_mcs[slot].mcs[n];
- }
- if (mcs != 99)
- {
- /* Use MCS to get the bler value. Since there can be multiple MCS
- values for a particular slot, we verify that all PDUs are not
- flagged for drop before returning. If even one is flagged for drop
- we return immediately because we drop the entire packet. */
-
- LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n",
- slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr);
-
- float bler_val;
- if (slot_rnti_mcs[slot].rvIndex[n] != 0)
- bler_val = 0;
- else
- bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10)));
- double drop_cutoff = ((double) rand() / (RAND_MAX));
- assert(drop_cutoff <= 1);
- LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]);
- if (drop_cutoff <= bler_val)
- {
- slot_rnti_mcs[slot].drop_flag[n] = true;
- LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot);
- return slot_rnti_mcs[slot].drop_flag[n];
- }
- }
-
- }
-
- if (mcs == 99)
- {
- LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n);
- abort();
- }
- return false;
-}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index 45d1a071ca..f663c17d10 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -40,45 +40,12 @@
#include "openair2/PHY_INTERFACE/queue_t.h"
#include "nfapi_nr_interface_scf.h"
#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "NR_Packet_Drop.h"
-#define NR_NUM_MCS 29
-#define NUM_SINR 100
-#define NUM_BLER_COL 13
-#define NUM_NFAPI_SLOT 20
-#define NR_NUM_LAYER 1
+extern slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t;
-typedef struct nr_phy_channel_params_t
-{
- uint16_t sfn_slot;
- uint16_t message_id;
- uint16_t nb_of_sinrs;
- float sinr[NR_NUM_LAYER];
- // Incomplete, need all channel parameters
-} nr_phy_channel_params_t;
-
-typedef struct
-{
- uint8_t slot;
- uint16_t rnti[256];
- uint8_t mcs[256];
- uint8_t rvIndex[256];
- float sinr;
- uint16_t num_pdus;
- bool drop_flag[256];
- bool latest;
-
-} slot_rnti_mcs_s;
-
-typedef struct
-{
- uint16_t length;
- float bler_table[NUM_SINR][NUM_BLER_COL];
-} nr_bler_struct;
-
-extern nr_bler_struct nr_bler_data[NR_NUM_MCS];
-
typedef enum {
ONLY_PUSCH,
NOT_PUSCH,
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c
new file mode 100644
index 0000000000..97938c6b02
--- /dev/null
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c
@@ -0,0 +1,183 @@
+/*
+ * 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
+ */
+#include
+#include "openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h"
+#include "executables/softmodem-common.h"
+#include "NR_MAC_UE/mac_proto.h"
+
+slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
+void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index)
+{
+ if (pdu == NULL)
+ {
+ LOG_E(NR_MAC,"PDU NULL\n");
+ abort();
+ }
+
+ /* This function is executed for every pdsch pdu type in a dl_tti_request. We save
+ the assocaited MCS and RNTI value for each. The 'index' passed in is a count of
+ how many times we have called this function for a particular dl_tti_request. It
+ allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/
+ for (int i = 0; i < NUM_NFAPI_SLOT; i++)
+ {
+ slot_rnti_mcs[i].latest = false;
+ }
+
+ CHECK_INDEX(slot_rnti_mcs[slot].rnti, index);
+ CHECK_INDEX(slot_rnti_mcs[slot].mcs, index);
+ CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index);
+ slot_rnti_mcs[slot].rnti[index] = pdu->rnti;
+ slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0];
+ slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0];
+ slot_rnti_mcs[slot].drop_flag[index] = false;
+ slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus
+ slot_rnti_mcs[slot].latest = true;
+ LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot);
+
+ return;
+}
+
+extern nr_bler_struct nr_bler_data[NR_NUM_MCS];
+float get_bler_val(uint8_t mcs, int sinr)
+{
+ // 4th col = dropped packets, 5th col = total packets
+ float bler_val = 0.0;
+ CHECK_INDEX(nr_bler_data, mcs);
+ LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr,
+ (int)(nr_bler_data[mcs].bler_table[0][0] * 10),
+ (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)
+ );
+
+ if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10))
+ {
+ LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs);
+ bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5];
+ return bler_val;
+ }
+ if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10))
+ {
+ LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs);
+ bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5];
+ return bler_val;
+ }
+ // Loop through bler table to find sinr_index
+ for (int i = 0; i < nr_bler_data[mcs].length; i++)
+ {
+ int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10);
+ if (temp_sinr == sinr)
+ {
+ bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+ return bler_val;
+ }
+ // Linear interpolation when SINR is between indices
+ if (temp_sinr > sinr)
+ {
+ float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5];
+ float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+ LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2);
+ return ((bler_val1 + bler_val2) / 2);
+ }
+ }
+ LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n");
+ abort();
+
+}
+
+bool is_channel_modeling(void)
+{
+ /* TODO: For now we enable channel modeling based on the node_number.
+ Replace with a command line option to enable/disable channel modeling.
+ The LTE UE will crash when channel modeling is conducted for NSA
+ mode. It does not crash for LTE mode. We have not implemented channel
+ modeling for NSA mode yet. For now, we ensure only do do channel modeling
+ in LTE/NR mode. */
+ return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa;
+}
+
+bool should_drop_transport_block(int slot, uint16_t rnti)
+{
+ if (!is_channel_modeling())
+ {
+ return false;
+ }
+
+ /* We want to avoid dropping setup messages because this would be pathological. */
+ NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+ if (mac->ra.ra_state < RA_SUCCEEDED)
+ {
+ LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state);
+ return false;
+ }
+
+ /* Get block error rate (bler_val) from table based on every saved
+ MCS and SINR to be used as the cutoff rate for dropping packets.
+ Generate random uniform vairable to compare against bler_val. */
+ int num_pdus = slot_rnti_mcs[slot].num_pdus;
+ assert(slot < 20 && slot >= 0);
+ LOG_D(NR_MAC, "rnti: %x num_pdus %d state %d slot %u sinr %f\n",
+ rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr);
+ assert(num_pdus > 0);
+ CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
+ CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
+ CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
+ int n = 0;
+ uint8_t mcs = 99;
+ for (n = 0; n < num_pdus; n++)
+ {
+ if (slot_rnti_mcs[slot].rnti[n] == rnti)
+ {
+ mcs = slot_rnti_mcs[slot].mcs[n];
+ }
+ if (mcs != 99)
+ {
+ /* Use MCS to get the bler value. Since there can be multiple MCS
+ values for a particular slot, we verify that all PDUs are not
+ flagged for drop before returning. If even one is flagged for drop
+ we return immediately because we drop the entire packet. */
+
+ LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n",
+ slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr);
+
+ float bler_val;
+ if (slot_rnti_mcs[slot].rvIndex[n] != 0)
+ bler_val = 0;
+ else
+ bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10)));
+ double drop_cutoff = ((double) rand() / (RAND_MAX));
+ assert(drop_cutoff <= 1);
+ LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]);
+ if (drop_cutoff <= bler_val)
+ {
+ slot_rnti_mcs[slot].drop_flag[n] = true;
+ LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot);
+ return slot_rnti_mcs[slot].drop_flag[n];
+ }
+ }
+
+ }
+
+ if (mcs == 99)
+ {
+ LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n);
+ abort();
+ }
+ return false;
+}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h
new file mode 100644
index 0000000000..549eb5c2e3
--- /dev/null
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h
@@ -0,0 +1,68 @@
+/*
+ * 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
+ */
+#ifndef __NR_CHAN_MODEL_H__
+#define __NR_CHAN_MODEL_H__
+
+#include
+#include
+#include
+#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
+
+#define NR_NUM_MCS 29
+#define NUM_SINR 100
+#define NUM_BLER_COL 13
+#define NUM_NFAPI_SLOT 20
+#define NR_NUM_LAYER 1
+#define MAX_CHAN_PARAMS 256
+
+typedef struct nr_phy_channel_params_t
+{
+ uint16_t sfn_slot;
+ uint16_t message_id;
+ uint16_t nb_of_sinrs;
+ float sinr[NR_NUM_LAYER];
+} nr_phy_channel_params_t;
+
+typedef struct
+{
+ uint8_t slot;
+ uint16_t rnti[MAX_CHAN_PARAMS];
+ uint8_t mcs[MAX_CHAN_PARAMS];
+ uint8_t rvIndex[MAX_CHAN_PARAMS];
+ float sinr;
+ uint16_t num_pdus;
+ bool drop_flag[MAX_CHAN_PARAMS];
+ bool latest;
+} slot_rnti_mcs_s;
+
+typedef struct
+{
+ uint16_t length;
+ float bler_table[NUM_SINR][NUM_BLER_COL];
+} nr_bler_struct;
+
+void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index);
+void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
+float get_bler_val(uint8_t mcs, int sinr);
+bool should_drop_transport_block(int slot, uint16_t rnti);
+bool is_channel_modeling(void);
+
+#endif
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c
index c4650f18f3..cd57ea9ff1 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.c
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.c
@@ -1956,7 +1956,7 @@ static int get_mcs_from_sinr(float sinr)
static int get_cqi_from_mcs(void)
{
- static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15};
+ static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15};
assert(NUM_ELEMENTS(mcs_to_cqi) == NUM_MCS);
int sf = 0;
while(sf < NUM_NFAPI_SUBFRAME)
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h
index d68d1dffdd..fe0e7be12e 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.h
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.h
@@ -21,7 +21,7 @@
//#include "openair1/PHY/LTE_TRANSPORT/defs.h"
#include "queue_t.h"
-#define NUM_MCS 28
+#define NUM_MCS 29
#define NUM_SINR 100
#define NUM_BLER_COL 13
#define LTE_NUM_LAYER 1
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index 952f32fb10..161d1cd847 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -357,7 +357,8 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
memcpy(msg->rrc_container, sduP, sdu_lenP);
msg->rrc_container_length=sdu_lenP;
itti_send_msg_to_task(TASK_DU_F1, 0, tmp);
- return(0);
+
+ return 0;
}
protocol_ctxt_t ctxt;
@@ -370,7 +371,6 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
nr_rrc_gNB_decode_ccch(&ctxt, sduP, sdu_lenP, NULL, CC_id);
}
}
-
return 0;
}
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 49de6cdb03..ea4e038ca0 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -42,6 +42,7 @@
#include
#include
+#include "executables/softmodem-common.h"
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "asn1_msg.h"
#include "../nr_rrc_proto.h"
@@ -198,8 +199,7 @@ int xer_nr_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td,
uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
asn_enc_rval_t enc_rval;
- rrc_gNB_carrier_data_t *carrier = &rrc->carrier;
- const gNB_RrcConfigurationReq *configuration = &rrc->configuration;
+ rrc_gNB_carrier_data_t *carrier = &rrc->carrier;
NR_BCCH_BCH_Message_t *mib = &carrier->mib;
NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon;
@@ -226,11 +226,18 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n");
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
frequency_range_t frequency_range = band<100?FR1:FR2;
- int ssb_subcarrier_offset;
- if(frequency_range == FR1)
- ssb_subcarrier_offset = (configuration->ssb_SubcarrierOffset<24) ? (configuration->ssb_SubcarrierOffset<<*scc->ssbSubcarrierSpacing) : configuration->ssb_SubcarrierOffset;
- else
- ssb_subcarrier_offset = configuration->ssb_SubcarrierOffset;
+ int scs_scaling = 1<<*scc->ssbSubcarrierSpacing;
+ if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
+ scs_scaling = scs_scaling*3;
+ if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
+ scs_scaling = scs_scaling>>2;
+ uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
+ int ssb_subcarrier_offset = 31; // default value for NSA
+ if (get_softmodem_params()->sa) {
+ ssb_subcarrier_offset = absolute_diff%(12*scs_scaling);
+ if(frequency_range == FR1)
+ ssb_subcarrier_offset <<= *scc->ssbSubcarrierSpacing;
+ }
mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset&15;
/*
@@ -1180,6 +1187,8 @@ void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
ubwp->bwp_Common->genericParameters.cyclicPrefix = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
}
+ int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+
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;
@@ -1192,125 +1201,17 @@ void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
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;
+ config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+ config_pucch_resset1(pucch_Config, NULL);
+ set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
- // 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;
+ scheduling_request_config(scc, pucch_Config);
+ set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
// PUSCH config
ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
@@ -1463,11 +1364,13 @@ void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
}
void fill_initial_SpCellConfig(int uid,
- NR_SpCellConfig_t *SpCellConfig,
+ NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
NR_ServingCellConfig_t *servingcellconfigdedicated,
- const gNB_RrcConfigurationReq *configuration)
-{
+ const gNB_RrcConfigurationReq *configuration) {
+
+ NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
+
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
// However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
@@ -1490,81 +1393,11 @@ void fill_initial_SpCellConfig(int uid,
initialUplinkBWP->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;
- // configure one single PUCCH0 opportunity for initial connection procedure
- // one symbol (13)
- NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
- pucchres0->pucch_ResourceId=0;
- //pucchres0->startingPRB=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->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);
+ config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+ config_pucch_resset1(pucch_Config, NULL);
+ set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
@@ -1713,31 +1546,9 @@ void fill_initial_SpCellConfig(int uid,
srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
- // configure Scheduling request
- // 40 slot period
- 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;
- AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
- "SCS != 30kHz\n");
+ scheduling_request_config(scc, pucch_Config);
- 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->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,
- "minRXTXTIME is %d but should be within [2,7)\n", configuration->minRXTXTIME);
- *delay[i] = i + configuration->minRXTXTIME;
- ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
- }
+ set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
SpCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->initialDownlinkBWP));
NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
@@ -1893,7 +1704,7 @@ void fill_initial_SpCellConfig(int uid,
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList));
NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00));
- *ssbres00 = 0;
+ *ssbres00 = 0;
ASN_SEQUENCE_ADD(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00);
csires1->bwp_Id = 0;
csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
@@ -1913,8 +1724,8 @@ void fill_initial_SpCellConfig(int uid,
}
NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1));
- pucchcsires1->uplinkBandwidthPartId=0;
- pucchcsires1->pucch_Resource=1;
+ pucchcsires1->uplinkBandwidthPartId = 0;
+ pucchcsires1->pucch_Resource = *pucch_Config->resourceSetToAddModList->list.array[1]->resourceList.list.array[0];
csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
if (pdsch_AntennaPorts > 1) {
@@ -2139,7 +1950,7 @@ NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR
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 ) {
+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;
@@ -2167,6 +1978,7 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
const gNB_RrcConfigurationReq* configuration) {
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
+
if (SpCellConfig == NULL) return;
NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL;
@@ -2185,9 +1997,9 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
}
}
}
-
}
+
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
@@ -2208,36 +2020,33 @@ void fill_initial_cellGroupConfig(int uid,
cellGroupConfig->rlc_BearerToReleaseList = NULL;
/* mac CellGroup Config */
- if (1) {
- mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig));
- if (1) {
- mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
- mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
- struct NR_SchedulingRequestToAddMod *schedulingrequestlist;
- schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
- schedulingrequestlist->schedulingRequestId = 0;
- schedulingrequestlist->sr_ProhibitTimer = CALLOC(1,sizeof(*schedulingrequestlist->sr_ProhibitTimer));
- *(schedulingrequestlist->sr_ProhibitTimer) = 0;
- schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
- ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
- }
- mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
- mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
- mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80;
- mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config));
- mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
- mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
- struct NR_TAG *tag=calloc(1,sizeof(*tag));
- tag->tag_Id = 0;
- tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
- ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
- mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
- mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
- mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
- mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf10;
- mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf10;
- mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1;
- }
+ mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig));
+
+ mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
+ mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
+ mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80;
+ mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config));
+ mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
+ mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
+ struct NR_TAG *tag=calloc(1,sizeof(*tag));
+ tag->tag_Id = 0;
+ tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
+ ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
+ mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
+ mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
+ mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf10;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf10;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1;
+
+ mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
+ mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
+ struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
+ schedulingrequestlist->schedulingRequestId = 0;
+ schedulingrequestlist->sr_ProhibitTimer = NULL;
+ schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
+ ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
+
cellGroupConfig->mac_CellGroupConfig = mac_CellGroupConfig;
physicalCellGroupConfig = calloc(1,sizeof(*physicalCellGroupConfig));
@@ -2247,8 +2056,8 @@ void fill_initial_cellGroupConfig(int uid,
cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig;
cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
-
- fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,servingcellconfigdedicated,configuration);
+
+ fill_initial_SpCellConfig(uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
cellGroupConfig->sCellToAddModList = NULL;
cellGroupConfig->sCellToReleaseList = NULL;
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index e79f79493d..61a81fb2d5 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -102,7 +102,7 @@ uint8_t do_RRCReject(uint8_t Mod_id,
uint8_t *const buffer);
void fill_initial_SpCellConfig(int uid,
- NR_SpCellConfig_t *SpCellConfig,
+ NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
NR_ServingCellConfig_t *servingcellconfigdedicated,
const gNB_RrcConfigurationReq *configuration);
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index 3517cf76a0..11460f86af 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -331,6 +331,7 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
int rbsize,
int mcs_table) {
+ NR_Phy_Parameters_t *phy_Parameters = &cap->phy_Parameters;
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
NR_BandNR_t *nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
nr_bandnr->bandNR = band;
@@ -344,8 +345,8 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
*bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported;
}
else{
- cap->phy_Parameters.phy_ParametersFR1 = CALLOC(1,sizeof(*cap->phy_Parameters.phy_ParametersFR1));
- NR_Phy_ParametersFR1_t *phy_fr1 = cap->phy_Parameters.phy_ParametersFR1;
+ phy_Parameters->phy_ParametersFR1 = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFR1));
+ NR_Phy_ParametersFR1_t *phy_fr1 = phy_Parameters->phy_ParametersFR1;
phy_fr1->pdsch_256QAM_FR1 = CALLOC(1,sizeof(*phy_fr1->pdsch_256QAM_FR1));
*phy_fr1->pdsch_256QAM_FR1 = NR_Phy_ParametersFR1__pdsch_256QAM_FR1_supported;
}
@@ -366,6 +367,9 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
*fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256;
ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, fs_cc);
}
+
+ phy_Parameters->phy_ParametersFRX_Diff = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFRX_Diff));
+ phy_Parameters->phy_ParametersFRX_Diff->pucch_F0_2WithoutFH = NULL;
}
void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
@@ -454,6 +458,205 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){
}
}
+void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time) {
+
+ 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+min_feedback_time;
+ ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
+ }
+}
+
+// PUCCH resource set 0 for configuration with O_uci <= 2 bits and/or a positive or negative SR (section 9.2.1 of 38.213)
+void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap) {
+
+ NR_PUCCH_ResourceSet_t *pucchresset = calloc(1,sizeof(*pucchresset));
+ pucchresset->pucch_ResourceSetId = 0;
+ NR_PUCCH_ResourceId_t *pucchid=calloc(1,sizeof(*pucchid));
+ *pucchid=0;
+ ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchid);
+ pucchresset->maxPayloadSize=NULL;
+
+ if(uecap) {
+ long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH;
+ AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F0 without frequency hopping. Current configuration is without FH\n");
+ }
+
+ NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
+ pucchres0->pucch_ResourceId=*pucchid;
+ 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);
+
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset);
+}
+
+
+// PUCCH resource set 1 for configuration with O_uci > 2 bits (currently format2)
+void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap) {
+
+ NR_PUCCH_ResourceSet_t *pucchresset=calloc(1,sizeof(*pucchresset));
+ pucchresset->pucch_ResourceSetId = 1;
+ NR_PUCCH_ResourceId_t *pucchressetid=calloc(1,sizeof(*pucchressetid));
+ *pucchressetid=2;
+ ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchressetid);
+ pucchresset->maxPayloadSize=NULL;
+
+ if(uecap) {
+ long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH;
+ AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F2 without frequency hopping. Current configuration is without FH\n");
+ }
+
+ NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
+ pucchres2->pucch_ResourceId=*pucchressetid;
+ 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);
+
+ ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset);
+
+ 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;
+
+ // to check UE capabilities for that in principle
+ pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
+ *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
+
+}
+
+void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs) {
+
+ pucch_Config->pucch_PowerControl = calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
+ NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
+ p00->p0_PUCCH_Id = 1;
+ p00->p0_PUCCH_Value = 0;
+ pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
+ ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
+
+ pucch_Config->pucch_PowerControl->pathlossReferenceRSs = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->pathlossReferenceRSs));
+ struct NR_PUCCH_PathlossReferenceRS *PL_ref_RS = calloc(1,sizeof(*PL_ref_RS));
+ PL_ref_RS->pucch_PathlossReferenceRS_Id = 0;
+ if(do_csirs) {
+ PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_csi_RS_Index;
+ PL_ref_RS->referenceSignal.choice.csi_RS_Index = 0;
+ }
+ else {
+ PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index;
+ PL_ref_RS->referenceSignal.choice.ssb_Index = 0;
+ }
+ ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->pathlossReferenceRSs->list,PL_ref_RS);
+
+ 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_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
+ *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
+
+ pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
+ pucch_Config->spatialRelationInfoToReleaseList=NULL;
+ 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 = PL_ref_RS->pucch_PathlossReferenceRS_Id;
+ pucchspatial->p0_PUCCH_Id = p00->p0_PUCCH_Id;
+ pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
+ ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
+}
+
+void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig,
+ NR_ServingCellConfigCommon_t *scc) {
+
+ const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+ int sr_slot = 1; // in FDD SR in slot 1
+ if(tdd)
+ sr_slot = tdd->nrofDownlinkSlots; // SR in the first uplink slot
+
+ schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
+
+ if(sr_slot<10){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = sr_slot;
+ return;
+ }
+ if(sr_slot<20){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl20 = sr_slot;
+ return;
+ }
+ if(sr_slot<40){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = sr_slot;
+ return;
+ }
+ if(sr_slot<80){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl80 = sr_slot;
+ return;
+ }
+ if(sr_slot<160){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl160 = sr_slot;
+ return;
+ }
+ if(sr_slot<320){
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl320 = sr_slot;
+ return;
+ }
+ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640;
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl640 = sr_slot;
+}
+
+void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
+ NR_PUCCH_Config_t *pucch_Config) {
+
+ // format with <=2 bits in pucch resource set 0
+ NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0];
+ // assigning the 1st pucch resource in the set to scheduling request
+ NR_PUCCH_ResourceId_t *pucchressetid = pucchresset->resourceList.list.array[0];
+
+ pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
+ NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
+ schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
+ schedulingRequestResourceConfig->schedulingRequestID = 0;
+
+ set_SR_periodandoffset(schedulingRequestResourceConfig, scc);
+
+ schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
+ *schedulingRequestResourceConfig->resource = *pucchressetid;
+ ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
+}
+
void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
NR_SpCellConfig_t *SpCellConfig,
NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index 8b28e2d584..1d6db7b64d 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -120,6 +120,12 @@ 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_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap);
+void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap);
+void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time);
+void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs);
+void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
+ NR_PUCCH_Config_t *pucch_Config);
void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_CSI_MeasConfig_t *csi_MeasConfig,
int uid,
@@ -138,5 +144,4 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
int rbsize,
int mcs_table);
-
#endif
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 89ae9c1d2b..3488080f27 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -447,7 +447,8 @@ typedef struct {
NR_BCCH_BCH_Message_t mib;
NR_BCCH_BCH_Message_t *mib_DU;
- NR_BCCH_DL_SCH_Message_t *siblock1_DU;
+ NR_SIB1_t *siblock1_DU;
+ //NR_BCCH_DL_SCH_Message_t *siblock1_DU;
NR_SIB1_t *sib1;
NR_SIB2_t *sib2;
NR_SIB3_t *sib3;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 6a320123de..d569b91aa8 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -120,7 +120,7 @@ rrc_gNB_generate_SecurityModeCommand(
rrc_gNB_ue_context_t *const ue_context_pP
);
-uint8_t
+ uint8_t
rrc_gNB_get_next_transaction_identifier(
module_id_t gnb_mod_idP
);
@@ -209,7 +209,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
void
rrc_gNB_generate_dedicatedRRCReconfiguration(
const protocol_ctxt_t *const ctxt_pP,
- rrc_gNB_ue_context_t *ue_context_pP);
+ rrc_gNB_ue_context_t *ue_context_pP,
+ NR_CellGroupConfig_t *cell_groupConfig_from_DU);
rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP,
const NR_SRB_ToAddModList_t * const srb2add_listP,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index d03e00f8c6..3d95081336 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -99,6 +99,7 @@
#include
#include
#include
+#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "BIT_STRING.h"
#include "assertions.h"
@@ -164,9 +165,8 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
LOG_I(NR_RRC,"Done init_NR_SI\n");
- if (NODE_IS_MONOLITHIC(rrc->node_type)){
+ if (NODE_IS_MONOLITHIC(rrc->node_type) || NODE_IS_DU(rrc->node_type)){
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
@@ -276,7 +276,6 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
NR_CellGroupConfig_t *cgc = get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : NULL;
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
@@ -472,7 +471,6 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
rrc_mac_config_req_gNB(rrc_instance_p->module_id,
- rrc_instance_p->configuration.ssb_SubcarrierOffset,
rrc_instance_p->configuration.pdsch_AntennaPorts,
rrc_instance_p->configuration.pusch_AntennaPorts,
rrc_instance_p->configuration.sib1_tda,
@@ -808,8 +806,8 @@ rrc_gNB_generate_defaultRRCReconfiguration(
}
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
+ gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
@@ -838,7 +836,8 @@ rrc_gNB_generate_defaultRRCReconfiguration(
void
rrc_gNB_generate_dedicatedRRCReconfiguration(
const protocol_ctxt_t *const ctxt_pP,
- rrc_gNB_ue_context_t *ue_context_pP
+ rrc_gNB_ue_context_t *ue_context_pP,
+ NR_CellGroupConfig_t *cell_groupConfig_from_DU
)
//-----------------------------------------------------------------------------
{
@@ -861,7 +860,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
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;
+ NR_CellGroupConfig_t *cellGroupConfig = NULL;
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
@@ -1017,9 +1016,17 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
}
memset(buffer, 0, sizeof(buffer));
- cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ if(cell_groupConfig_from_DU == NULL){
+ cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
+ // bearer IDs for the DRBs
+ 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);
+ }
+ else{
+ LOG_I(NR_RRC, "Master cell group originating from the DU \n");
+ cellGroupConfig = cell_groupConfig_from_DU;
+ }
- 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,
@@ -1075,7 +1082,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
@@ -1420,7 +1426,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
NR_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid];
NR_DRB_Identity_t *drb_id_p = NULL;
// uint8_t nr_DRB2LCHAN[8];
- gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
@@ -1459,7 +1464,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
NULL,
get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
/* Refresh SRBs/DRBs */
-
if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
LOG_D(NR_RRC,"Configuring RLC DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti);
nr_rrc_rlc_config_asn1_req(ctxt_pP,
@@ -1469,49 +1473,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
NULL,
get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
}
- else if(SRB_configList!=NULL || DRB_configList!=NULL){
- MessageDef *message_p;
- message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ);
- f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
- req->gNB_CU_ue_id = 0;
- req->gNB_DU_ue_id = 0;
- req->rnti = ue_context_pP->ue_context.rnti;
- req->mcc = rrc->configuration.mcc[0];
- req->mnc = rrc->configuration.mnc[0];
- req->mnc_digit_length = rrc->configuration.mnc_digit_length[0];
- req->nr_cellid = rrc->nr_cellid;
- if(SRB_configList!=NULL){
- req->srbs_to_be_setup = malloc(SRB_configList->list.count*sizeof(f1ap_srb_to_be_setup_t));
- req->srbs_to_be_setup_length = SRB_configList->list.count;
- f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
- for (int i = 0; i < SRB_configList->list.count; i++){
- if(SRB_configList->list.array[i]->srb_Identity > 1){
- SRBs[i].srb_id = SRB_configList->list.array[i]->srb_Identity;
- SRBs[i].lcid = SRB_configList->list.array[i]->srb_Identity;
- }
- }
- }
- if(DRB_configList!=NULL){
- gtpv1u_gnb_create_tunnel_req_t create_tunnel_req;
- memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
- req->drbs_to_be_setup = malloc(DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
- req->drbs_to_be_setup_length = DRB_configList->list.count;
- f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
- LOG_I(RRC, "Length of DRB list:%d, %d \n", DRB_configList->list.count, req->drbs_to_be_setup_length);
- for (int i = 0; i < DRB_configList->list.count; i++){
- DRBs[i].drb_id = DRB_configList->list.array[i]->drb_Identity;
- DRBs[i].rlc_mode = RLC_MODE_AM;
- DRBs[i].up_ul_tnl[0].tl_address = inet_addr(rrc->eth_params_s.my_addr);
- DRBs[i].up_ul_tnl[0].port=rrc->eth_params_s.my_portd;
- DRBs[i].up_ul_tnl_length = 1;
- DRBs[i].up_dl_tnl[0].tl_address = inet_addr(rrc->eth_params_s.remote_addr);
- DRBs[i].up_dl_tnl[0].port=rrc->eth_params_s.remote_portd;
- DRBs[i].up_dl_tnl_length = 1;
- }
- LOG_I(RRC, "Send F1AP_UE_CONTEXT_SETUP_REQ with ITTI\n");
- }
- itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
- }
#endif
/* Set the SRB active in UE context */
@@ -1996,7 +1957,6 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
gNB_RrcConfigurationReq *configuration = &RC.nrrrc[ctxt_pP->module_id]->configuration;
rrc_mac_config_req_gNB(ctxt_pP->module_id,
- configuration->ssb_SubcarrierOffset,
configuration->pdsch_AntennaPorts,
configuration->pusch_AntennaPorts,
configuration->sib1_tda,
@@ -2814,11 +2774,76 @@ rrc_gNB_decode_dcch(
ul_dcch_msg);
}
- if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
- rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p);
- } else {
- rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+ if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)){
+ if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+ rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p, NULL);
+ } else {
+ rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+ }
}
+ else{
+ /*Generate a UE context setup request message towards the DU to provide the UE
+ *capability info and get the updates on master cell group config from the DU*/
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ);
+ f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
+ //UE_IDs will be extracted from F1AP layer
+ req->gNB_CU_ue_id = 0;
+ req->gNB_DU_ue_id = 0;
+ req->rnti = ue_context_p->ue_context.rnti;
+ req->mcc = RC.nrrrc[ctxt_pP->module_id]->configuration.mcc[0];
+ req->mnc = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc[0];
+ req->mnc_digit_length = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc_digit_length[0];
+ req->nr_cellid = RC.nrrrc[ctxt_pP->module_id]->nr_cellid;
+
+ if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+ /*Instruction towards the DU for SRB2 configuration*/
+ req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t));
+ req->srbs_to_be_setup_length = 1;
+ f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
+ SRBs[0].srb_id = 2;
+ SRBs[0].lcid = 2;
+
+ /*Instruction towards the DU for DRB configuration and tunnel creation*/
+ gtpv1u_gnb_create_tunnel_req_t create_tunnel_req;
+ memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
+ req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t));
+ req->drbs_to_be_setup_length = 1;
+ f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
+ LOG_I(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length);
+ DRBs[0].drb_id = 1;
+ DRBs[0].rlc_mode = RLC_MODE_AM;
+ DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_addr);
+ DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_portd;
+ DRBs[0].up_ul_tnl_length = 1;
+ DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_addr);
+ DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_portd;
+ DRBs[0].up_dl_tnl_length = 1;
+ }
+ if( ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.present ==
+ NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation ) {
+ struct NR_UE_CapabilityRAT_ContainerList *ue_CapabilityRAT_ContainerList =
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList;
+ if(ue_CapabilityRAT_ContainerList!=NULL){
+ LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is present \n");
+ req->cu_to_du_rrc_information = calloc(1,sizeof(cu_to_du_rrc_information_t));
+ req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = calloc(1,4096);
+ asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_CapabilityRAT_ContainerList,
+ NULL,
+ ue_CapabilityRAT_ContainerList,
+ req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+ 4096);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 ue_CapabilityRAT_ContainerList encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = (enc_rval.encoded+7)>>3;
+ }
+ else{
+ LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is not present \n");
+ }
+ }
+ itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
+ }
+
break;
@@ -2931,11 +2956,8 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
memset(mib->message.choice.mib,0,sizeof(struct NR_MIB));
memcpy(mib->message.choice.mib, mib_DU->message.choice.mib, sizeof(struct NR_MIB));
- rrc->carrier.SIB1 = malloc(f1_setup_req->sib1_length[i]);
- rrc->carrier.sizeof_SIB1 = f1_setup_req->sib1_length[i];
- memcpy((void *)rrc->carrier.SIB1,f1_setup_req->sib1[i],f1_setup_req->sib1_length[i]);
dec_rval = uper_decode_complete(NULL,
- &asn_DEF_NR_BCCH_DL_SCH_Message,
+ &asn_DEF_NR_SIB1, //&asn_DEF_NR_BCCH_DL_SCH_Message,
(void **)&rrc->carrier.siblock1_DU,
f1_setup_req->sib1[i],
f1_setup_req->sib1_length[i]);
@@ -2945,12 +2967,12 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
dec_rval.consumed );
// Parse message and extract SystemInformationBlockType1 field
- NR_BCCH_DL_SCH_Message_t *bcch_message = rrc->carrier.siblock1_DU;
- AssertFatal(bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1,
- "bcch_message->message.present != NR_BCCH_DL_SCH_MessageType_PR_c1\n");
- AssertFatal(bcch_message->message.choice.c1->present == NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1,
- "bcch_message->message.choice.c1->present != NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1\n");
- rrc->carrier.sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
+ rrc->carrier.sib1 = rrc->carrier.siblock1_DU;
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1)){
+ LOG_I(NR_RRC, "Printing received SIB1 container inside F1 setup request message:\n");
+ xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)rrc->carrier.sib1);
+ }
+
rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name = rrc->node_name;
@@ -3278,6 +3300,94 @@ 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;
+ if(req->cu_to_du_rrc_information!=NULL){
+ if(req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+ LOG_I(NR_RRC, "Length of ue_CapabilityRAT_ContainerList is: %d \n", (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+ struct NR_UE_CapabilityRAT_ContainerList *ue_CapabilityRAT_ContainerList = NULL;
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_UE_CapabilityRAT_ContainerList,
+ (void **)&ue_CapabilityRAT_ContainerList,
+ (uint8_t *)req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+ (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ AssertFatal(1==0,"UE Capability RAT ContainerList decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_UE_CapabilityRAT_ContainerList, ue_CapabilityRAT_ContainerList, 1 );
+ return;
+ }
+ //To fill ue_context.UE_Capability_MRDC, ue_context.UE_Capability_nr ...
+ int NR_index = -1;
+ for(int i = 0;i < ue_CapabilityRAT_ContainerList->list.count; i++){
+ if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_nr){
+ LOG_I(NR_RRC, "DU received NR_RAT_Type_nr UE capabilities Info through the UE Context Setup Request from the CU \n");
+ if(ue_context_p->ue_context.UE_Capability_nr){
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_NR_Capability,
+ (void**)&ue_context_p->ue_context.UE_Capability_nr,
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+ 0,0);
+ if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+ xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ }
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+ LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ ue_context_p->ue_context.UE_Capability_size =
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+ if(NR_index != -1){
+ LOG_E(NR_RRC,"fatal: more than 1 eutra capability\n");
+ exit(1);
+ }
+ NR_index = i;
+ }
+
+ if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_eutra_nr){
+ LOG_I(NR_RRC, "DU received NR_RAT_Type_eutra_nr UE capabilities Info through the UE Context Setup Request from the CU \n");
+ if(ue_context_p->ue_context.UE_Capability_MRDC){
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_MRDC_Capability,
+ (void**)&ue_context_p->ue_context.UE_Capability_MRDC,
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+ 0,0);
+ if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+ xer_fprint(stdout,&asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ }
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+ LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+ ue_context_p->ue_context.UE_MRDC_Capability_size =
+ ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+ }
+
+ if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_eutra){
+ //TODO
+ }
+ }
+ }
+ }
+
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)
@@ -3331,11 +3441,25 @@ 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);
+ NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ if (req->srbs_to_be_setup_length > 0 || req->drbs_to_be_setup_length>0)
+ // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
+ // bearer IDs for the DRBs
+ 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);
+
+ if(req->rrc_container_length > 0){
+ mem_block_t *pdcp_pdu_p = get_free_mem_block(req->rrc_container_length, __func__);
+ memcpy(&pdcp_pdu_p->data[0], req->rrc_container, req->rrc_container_length);
+ du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, req->rrc_container_length, pdcp_pdu_p);
+ LOG_I(F1AP, "Printing RRC Container of UE context setup request: \n");
+ for (int j=0; jrrc_container_length; j++){
+ printf("%02x ", pdcp_pdu_p->data[j]);
+ }
+ printf("\n");
+ }
+
/* Fill the UE context setup response ITTI message to send to F1AP */
resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
resp->rnti = ctxt.rnti;
@@ -3370,17 +3494,174 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
else{
LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context setup request at the DU\n");
}
- resp->du_to_cu_rrc_information = calloc(1,1024*sizeof(uint8_t));
+ /* fixme:
+ * Here we should be encoding the updates on cellgroupconfig based on the content of UE capabilities
+ */
+ resp->du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t));
+ resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024);
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
- (void *)cellGroupConfig,
- resp->du_to_cu_rrc_information,
+ ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig,
+ resp->du_to_cu_rrc_information->cellGroupConfig,
1024);
- resp->du_to_cu_rrc_information_length = (enc_rval.encoded+7)>>3;
+ if (enc_rval.encoded == -1) {
+ LOG_E(F1AP,"Could not encode ue_context.masterCellGroup, failed element %s\n",enc_rval.failed_type->name);
+ exit(-1);
+ }
+ resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
free(cellGroupConfig);
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
}
+static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
+
+ f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
+ protocol_ctxt_t ctxt;
+ ctxt.rnti = req->rnti;
+ ctxt.module_id = instance;
+ ctxt.instance = instance;
+ ctxt.enb_flag = 1;
+ gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
+ gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
+ struct rrc_gNB_ue_context_s *ue_context_p =
+ rrc_gNB_get_ue_context(rrc, ctxt.rnti);
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
+ f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_MODIFICATION_RESP(message_p);
+ uint32_t incoming_teid = 0;
+ NR_CellGroupConfig_t *cellGroupConfig = NULL;
+
+ /* Configure SRB2 */
+ NR_SRB_ToAddMod_t *SRB2_config = NULL;
+ NR_SRB_ToAddModList_t *SRB_configList = NULL;
+ uint8_t SRBs_before_new_addition = 0;
+
+ if(req->srbs_to_be_setup_length>0){
+ if(ue_context_p->ue_context.SRB_configList == NULL){
+ LOG_W(NR_RRC, "The SRB list of the UE context is empty before the addition of new SRB at the DU \n");
+ ue_context_p->ue_context.SRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.SRB_configList));
+ }
+ SRB_configList = ue_context_p->ue_context.SRB_configList;
+ SRBs_before_new_addition = SRB_configList->list.count;
+ for (int i=0; isrbs_to_be_setup_length; i++){
+ SRB2_config = CALLOC(1, sizeof(*SRB2_config));
+ SRB2_config->srb_Identity = req->srbs_to_be_setup[i].srb_id;
+ ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);
+ }
+ }
+
+ /* Configure DRB */
+ NR_DRB_ToAddMod_t *DRB_config = NULL;
+ NR_DRB_ToAddModList_t *DRB_configList = NULL;
+ if(req->drbs_to_be_setup_length>0){
+ if(ue_context_p->ue_context.DRB_configList == NULL){
+ 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;
+ 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;
+ ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config);
+ f1ap_drb_to_be_setup_t drb_p = req->drbs_to_be_setup[i];
+ transport_layer_addr_t addr;
+ 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;
+ incoming_teid=newGtpuCreateTunnel(DUuniqInstance,
+ req->rnti,
+ drb_p.drb_id,
+ drb_p.drb_id,
+ drb_p.up_ul_tnl[0].teid,
+ addr,
+ drb_p.up_ul_tnl[0].port,
+ DURecvCb);
+ }
+ }
+
+ if(req->srbs_to_be_setup_length>0 || req->drbs_to_be_setup_length>0){
+ cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ uint8_t drb_id_to_setup_start = 1;
+ long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
+ fill_mastercellGroupConfig(cellGroupConfig,
+ ue_context_p->ue_context.masterCellGroup,
+ rrc->um_on_default_drb,
+ drb_id_to_setup_start < 2 ? 1 : 0,
+ drb_id_to_setup_start,
+ req->drbs_to_be_setup_length,
+ drb_priority);
+ apply_macrlc_config(rrc, ue_context_p, &ctxt);
+ }
+ if(req->ReconfigComplOutcome == RRCreconf_failure){
+ LOG_W(NR_RRC, "CU reporting RRC Reconfiguration failure \n");
+ }
+ else if(req->ReconfigComplOutcome == RRCreconf_success){
+ LOG_I(NR_RRC, "CU reporting RRC Reconfiguration success \n");
+ if(ue_context_p->ue_context.DRB_configList!=NULL){
+ LOG_I(NR_RRC, "Send first DDD buffer status reporting towards the CU through an ITTI message to gtp-u \n");
+ uint8_t drb_id = ue_context_p->ue_context.DRB_configList->list.array[0]->drb_Identity;
+ rnti_t rnti = ue_context_p->ue_context.rnti;
+ int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(rnti, drb_id);
+ LOG_I(NR_RRC, "Reported in DDD drb_id:%d, rnti:%d\n", drb_id, rnti);
+ MessageDef *msg = itti_alloc_new_message_sized(TASK_RRC_GNB, 0, GTPV1U_DU_BUFFER_REPORT_REQ,
+ sizeof(gtpv1u_gnb_tunnel_data_req_t));
+ gtpv1u_DU_buffer_report_req_t *req=>PV1U_DU_BUFFER_REPORT_REQ(msg);
+ req->pdusession_id = drb_id;
+ req->rnti = rnti;
+ req->buffer_availability = rlc_tx_buffer_space; //10000000; //Hardcoding to be removed and read the actual RLC buffer availability instead
+ extern instance_t DUuniqInstance;
+ itti_send_msg_to_task(TASK_GTPV1_U, DUuniqInstance, msg);
+
+ }
+ }
+
+ /* Fill the UE context setup response ITTI message to send to F1AP */
+ resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
+ resp->rnti = ctxt.rnti;
+ if(DRB_configList){
+ if(DRB_configList->list.count > 0){
+ resp->drbs_to_be_setup = calloc(1,DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
+ resp->drbs_to_be_setup_length = DRB_configList->list.count;
+ for (int i=0; ilist.count; i++){
+ resp->drbs_to_be_setup[i].drb_id = DRB_configList->list.array[i]->drb_Identity;
+ resp->drbs_to_be_setup[i].rlc_mode = RLC_MODE_AM;
+ resp->drbs_to_be_setup[i].up_dl_tnl[0].teid = incoming_teid;
+ resp->drbs_to_be_setup[i].up_dl_tnl[0].tl_address = inet_addr(mac->eth_params_n.my_addr);
+ resp->drbs_to_be_setup[i].up_dl_tnl_length = 1;
+ }
+ }
+ else{
+ LOG_W(NR_RRC, "No DRB added upon reception of F1 UE context modification request with a DRB to setup list\n");
+ }
+ }
+ if(SRB_configList){
+ if(SRB_configList->list.count >0 && SRBs_before_new_addition < SRB_configList->list.count){
+ resp->srbs_to_be_setup = calloc(1,req->srbs_to_be_setup_length*sizeof(f1ap_srb_to_be_setup_t));
+ resp->srbs_to_be_setup_length = req->srbs_to_be_setup_length;
+ for (int i=SRBs_before_new_addition; ilist.count; i++){
+ resp->srbs_to_be_setup[i-SRBs_before_new_addition].srb_id = SRB_configList->list.array[i]->srb_Identity;
+ }
+ }
+ else{
+ LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n");
+ }
+ }
+ else{
+ LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n");
+ }
+
+ //if(cellGroupConfig != NULL) {
+ resp->du_to_cu_rrc_information = calloc(1,sizeof(du_to_cu_rrc_information_t));
+ resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024);
+ asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
+ NULL,
+ ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig,
+ resp->du_to_cu_rrc_information->cellGroupConfig,
+ 1024);
+ resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
+ //}
+ itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
+}
+
static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
@@ -3396,8 +3677,8 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
&asn_DEF_NR_CellGroupConfig,
(void **)&cellGroupConfig,
- (uint8_t *)resp->du_to_cu_rrc_information,
- (int) resp->du_to_cu_rrc_information_length);
+ (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
+ (int) resp->du_to_cu_rrc_information->cellGroupConfig_length);
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
AssertFatal(1==0,"Cell group config decode error\n");
@@ -3412,20 +3693,89 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
}
if(cellGroupConfig->rlc_BearerToAddModList!=NULL){
if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){
- LOG_I(NR_RRC, "rlc_BearerToAddModList not empty before filling it \n");
- free(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList);
+ int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count;
+ for(int i=ue_ctxt_rlc_Bearers; irlc_BearerToAddModList->list.count; i++){
+ ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list,
+ cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]);
+ }
}
- ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
- memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
+ else{
+ LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n");
+ ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ }
}
xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup);
+ if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+ rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig);
+ } else {
+ rrc_gNB_generate_defaultRRCReconfiguration(&ctxt, ue_context_p);
+ }
+
free(cellGroupConfig->rlc_BearerToAddModList);
free(cellGroupConfig);
}
+static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
+
+ f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
+ protocol_ctxt_t ctxt;
+ ctxt.rnti = resp->rnti;
+ ctxt.module_id = instance;
+ ctxt.instance = instance;
+ ctxt.enb_flag = 1;
+ ctxt.eNB_index = instance;
+ gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
+ struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti);
+ NR_CellGroupConfig_t *cellGroupConfig = NULL;
+
+ if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_CellGroupConfig,
+ (void **)&cellGroupConfig,
+ (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
+ (int) resp->du_to_cu_rrc_information->cellGroupConfig_length);
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ AssertFatal(1==0,"Cell group config decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, cellGroupConfig, 1 );
+ return;
+ }
+ //xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, cellGroupConfig);
+
+ if(ue_context_p->ue_context.masterCellGroup == NULL){
+ ue_context_p->ue_context.masterCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t));
+ }
+
+ if(cellGroupConfig->rlc_BearerToAddModList!=NULL){
+ if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){
+ int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count;
+ for(int i=ue_ctxt_rlc_Bearers; irlc_BearerToAddModList->list.count; i++){
+ ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list,
+ cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]);
+ }
+ }
+ else{
+ LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n");
+ ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
+ sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ }
+ }
+ LOG_I(NR_RRC, "Updated master cell group configuration stored at the UE context of the CU:\n");
+ xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup);
+
+ rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig);
+
+ free(cellGroupConfig->rlc_BearerToAddModList);
+ free(cellGroupConfig);
+ }
+}
+
unsigned int mask_flip(unsigned int x) {
return((((x>>8) + (x<<8))&0xffff)>>6);
}
@@ -3627,15 +3977,27 @@ 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(nrmac, ctxt_pP->rnti);
- rrc_rlc_remove_ue(ctxt_pP);
- pdcp_remove_UE(ctxt_pP);
+ if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->instance]->node_type)){
+ mac_remove_nr_ue(nrmac, ctxt_pP->rnti);
+ rrc_rlc_remove_ue(ctxt_pP);
+ pdcp_remove_UE(ctxt_pP);
- /* remove RRC UE Context */
- ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
- if (ue_context_p) {
- rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
- LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti);
+ /* remove RRC UE Context */
+ ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
+ if (ue_context_p) {
+ rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
+ LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti);
+ }
+ }
+ // In case of CU trigger UE context release command towards the DU
+ else{
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
+ f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p);
+ rel_cmd->rnti = ctxt_pP->rnti;
+ rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
+ rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
+ itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p);
}
}
@@ -3821,17 +4183,30 @@ void *rrc_gnb_task(void *args_p) {
rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p));
break;
- case NR_DU_RRC_DL_INDICATION:
- rrc_process_DU_DL(msg_p, msg_name_p, instance);
- break;
+ case NR_DU_RRC_DL_INDICATION:
+ rrc_process_DU_DL(msg_p, msg_name_p, instance);
+ break;
- case F1AP_UE_CONTEXT_SETUP_REQ:
- rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance);
- break;
+ case F1AP_UE_CONTEXT_SETUP_REQ:
+ rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance);
+ break;
- case F1AP_UE_CONTEXT_SETUP_RESP:
- rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance);
- break;
+ case F1AP_UE_CONTEXT_SETUP_RESP:
+ rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance);
+ break;
+
+ case F1AP_UE_CONTEXT_MODIFICATION_RESP:
+ rrc_CU_process_ue_context_modification_response(msg_p, msg_name_p, instance);
+ break;
+
+ case F1AP_UE_CONTEXT_MODIFICATION_REQ:
+ rrc_DU_process_ue_context_modification_request(msg_p, msg_name_p, instance);
+ break;
+
+ case F1AP_UE_CONTEXT_RELEASE_CMD:
+ LOG_W(NR_RRC, "Received F1AP_UE_CONTEXT_RELEASE_CMD for processing at the RRC layer of the DU. Processing function "
+ "implementation is pending\n");
+ break;
/* Messages from X2AP */
case X2AP_ENDC_SGNB_ADDITION_REQ:
@@ -4102,5 +4477,6 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe)
message_p = itti_alloc_new_message(TASK_RRC_GNB, 0, RRC_SUBFRAME_PROCESS);
RRC_SUBFRAME_PROCESS(message_p).ctxt = *ctxt;
RRC_SUBFRAME_PROCESS(message_p).CC_id = CC_id;
+ LOG_D(NR_RRC, "Time in RRC: %u/ %u \n", frame, subframe);
itti_send_msg_to_task(TASK_RRC_GNB, ctxt->module_id, message_p);
}
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 96ec634433..0dcd064663 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -307,7 +307,6 @@ nr_rrc_pdcp_config_security(
//uint8_t *k_kdf = NULL;
static int print_keys= 1;
-
/* Derive the keys from kgnb */
if (SRB_configList != NULL) {
nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
@@ -1050,7 +1049,46 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
// TEST
// ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
// rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
- rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
+ if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)){
+ rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, NULL);
+ }
+ else{
+ /*Generate a UE context modification request message towards the DU to instruct the DU
+ *for SRB2 and DRB configuration and get the updates on master cell group config from the DU*/
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ);
+ f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_MODIFICATION_REQ (message_p);
+ req->rnti = ue_context_p->ue_context.rnti;
+ req->mcc = RC.nrrrc[ctxt.module_id]->configuration.mcc[0];
+ req->mnc = RC.nrrrc[ctxt.module_id]->configuration.mnc[0];
+ req->mnc_digit_length = RC.nrrrc[ctxt.module_id]->configuration.mnc_digit_length[0];
+ req->nr_cellid = RC.nrrrc[ctxt.module_id]->nr_cellid;
+
+ /*Instruction towards the DU for SRB2 configuration*/
+ req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t));
+ req->srbs_to_be_setup_length = 1;
+ f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
+ SRBs[0].srb_id = 2;
+ SRBs[0].lcid = 2;
+
+ /*Instruction towards the DU for DRB configuration and tunnel creation*/
+ gtpv1u_gnb_create_tunnel_req_t create_tunnel_req;
+ memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
+ req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t));
+ req->drbs_to_be_setup_length = 1;
+ f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
+ LOG_D(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length);
+ DRBs[0].drb_id = 1;
+ DRBs[0].rlc_mode = RLC_MODE_AM;
+ DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
+ DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd;
+ DRBs[0].up_ul_tnl_length = 1;
+ DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr);
+ DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
+ DRBs[0].up_dl_tnl_length = 1;
+
+ itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
+ }
return(0);
}
}
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 07a6bd85be..b3eada8136 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -349,7 +349,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
// configure MAC and RLC
if (NODE_IS_DU(rrc->node_type)) {
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
@@ -362,7 +361,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
ue_context_p->ue_context.secondaryCellGroup);
} else {
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->configuration.ssb_SubcarrierOffset,
rrc->configuration.pdsch_AntennaPorts,
rrc->configuration.pusch_AntennaPorts,
rrc->configuration.sib1_tda,
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index a6fef46c34..44212cbf7a 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -337,128 +337,26 @@ void fill_default_nsa_uplinkBWP(NR_BWP_Uplink_t *ubwp,
/// BWP dedicated configuration
- if (!ubwp->bwp_Dedicated) {
+ if (!ubwp->bwp_Dedicated)
ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
- }
+
+ int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+
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));
+ config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+ config_pucch_resset1(pucch_Config, NULL);
+ set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
- 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;
+ scheduling_request_config(servingcellconfigcommon, pucch_Config);
+ set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
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;
@@ -648,40 +546,33 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->rlc_BearerToAddModList = calloc(1,sizeof(*secondaryCellGroup->rlc_BearerToAddModList));
ASN_SEQUENCE_ADD(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig);
- secondaryCellGroup->mac_CellGroupConfig=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig));
- secondaryCellGroup->mac_CellGroupConfig->drx_Config = NULL;
- secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig));
- secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
- NR_SchedulingRequestToAddMod_t *SchedulingRequestConf = calloc(1,sizeof(*SchedulingRequestConf));
- SchedulingRequestConf->schedulingRequestId = 0; //Could be changed
- SchedulingRequestConf->sr_ProhibitTimer = calloc(1,sizeof(*SchedulingRequestConf->sr_ProhibitTimer));
- *SchedulingRequestConf->sr_ProhibitTimer = NR_SchedulingRequestToAddMod__sr_ProhibitTimer_ms16;
- SchedulingRequestConf->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n32;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list,SchedulingRequestConf);
- secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToReleaseList = NULL;
+ NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = secondaryCellGroup->mac_CellGroupConfig;
- secondaryCellGroup->mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->bsr_Config));
- secondaryCellGroup->mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
- secondaryCellGroup->mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf160;
- secondaryCellGroup->mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config));
- secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
- secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList));
+ mac_CellGroupConfig=calloc(1,sizeof(*mac_CellGroupConfig));
+ mac_CellGroupConfig->drx_Config = NULL;
+
+ mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*mac_CellGroupConfig->bsr_Config));
+ mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
+ mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf160;
+ mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*mac_CellGroupConfig->tag_Config));
+ mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
+ mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
struct NR_TAG *tag=calloc(1,sizeof(*tag));
tag->tag_Id = 0;
tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
- secondaryCellGroup->mac_CellGroupConfig->phr_Config = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config));
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup));
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->dummy=false;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false;
- secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real;
- secondaryCellGroup->mac_CellGroupConfig->skipUplinkTxDynamic=false;
- secondaryCellGroup->mac_CellGroupConfig->ext1 = NULL;
+ ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
+ mac_CellGroupConfig->phr_Config = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config));
+ mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
+ mac_CellGroupConfig->phr_Config->choice.setup = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3;
+ mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false;
+ mac_CellGroupConfig->phr_Config->choice.setup->dummy=false;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real;
+ mac_CellGroupConfig->skipUplinkTxDynamic=false;
+ mac_CellGroupConfig->ext1 = NULL;
secondaryCellGroup->physicalCellGroupConfig = calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig));
secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH=NULL;
secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH=NULL;
@@ -1140,6 +1031,14 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
+ mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
+ mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
+ struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
+ schedulingrequestlist->schedulingRequestId = 0;
+ schedulingrequestlist->sr_ProhibitTimer = NULL;
+ schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
+ ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
+
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));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup;
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
index 9655f87130..abdc5b2e75 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
@@ -80,7 +80,6 @@ typedef struct {
uint8_t kgnb[32];
} ue_sa_security_key_t;
-
typedef enum fgs_protocol_discriminator_e {
/* Protocol discriminator identifier for 5GS Mobility Management */
FGS_MOBILITY_MANAGEMENT_MESSAGE = 0x7E,
diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h
index 00b650a302..0361c34f33 100644
--- a/openair3/UTILS/conversions.h
+++ b/openair3/UTILS/conversions.h
@@ -70,8 +70,8 @@
/* Convert an integer on 16 bits to the given bUFFER */
#define INT16_TO_BUFFER(x, buf) \
do { \
- (buf)[0] = (x) >> 8; \
- (buf)[1] = (x); \
+ (buf)[0] = ((x) >> 8) & 0xff; \
+ (buf)[1] = (x) & 0xff; \
} while(0)
/* Convert an array of char containing vALUE to x */
@@ -84,9 +84,9 @@ do { \
/* Convert an integer on 24 bits to the given bUFFER */
#define INT24_TO_BUFFER(x, buf) \
do { \
- (buf)[0] = (x) >> 16; \
- (buf)[1] = (x) >> 8; \
- (buf)[2] = (x); \
+ (buf)[0] = ((x) >> 16) & 0xff;\
+ (buf)[1] = ((x) >> 8) & 0xff; \
+ (buf)[2] = (x) & 0xff; \
} while(0)
/* Convert an array of char containing vALUE to x */
@@ -101,10 +101,10 @@ do { \
/* Convert an integer on 32 bits to the given bUFFER */
#define INT32_TO_BUFFER(x, buf) \
do { \
- (buf)[0] = (x) >> 24; \
- (buf)[1] = (x) >> 16; \
- (buf)[2] = (x) >> 8; \
- (buf)[3] = (x); \
+ (buf)[0] = ((x) >> 24) & 0xff;\
+ (buf)[1] = ((x) >> 16) & 0xff;\
+ (buf)[2] = ((x) >> 8) & 0xff; \
+ (buf)[3] = (x) & 0xff; \
} while(0)
/* Convert an array of char containing vALUE to x */
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index 9537f9e18a..a6bda28b57 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -17,6 +17,7 @@ extern "C" {
#include
#include
#include
+#include
#include "openair2/SDAP/nr_sdap/nr_sdap.h"
//#include
@@ -36,6 +37,22 @@ typedef struct Gtpv1uMsgHeader {
teid_t teid;
} __attribute__((packed)) Gtpv1uMsgHeaderT;
+//TS 38.425, Figure 5.5.2.2-1
+typedef struct DlDataDeliveryStatus_flags {
+ uint8_t LPR:1; //Lost packet report
+ uint8_t FFI:1; //Final Frame Ind
+ uint8_t deliveredPdcpSn:1; //Highest Delivered NR PDCP SN Ind
+ uint8_t transmittedPdcpSn:1; //Highest Transmitted NR PDCP SN Ind
+ uint8_t pduType:4; //PDU type
+ uint8_t CR:1; //Cause Report
+ uint8_t deliveredReTxPdcpSn:1; //Delivered retransmitted NR PDCP SN Ind
+ uint8_t reTxPdcpSn:1; //Retransmitted NR PDCP SN Ind
+ uint8_t DRI:1; //Data Rate Indication
+ uint8_t deliveredPdcpSnRange:1; //Delivered NR PDCP SN Range Ind
+ uint8_t spare:3;
+ uint32_t drbBufferSize; //Desired buffer size for the data radio bearer
+} __attribute__((packed)) DlDataDeliveryStatus_flagsT;
+
typedef struct Gtpv1uMsgHeaderOptFields {
uint8_t seqNum1Oct;
uint8_t seqNum2Oct;
@@ -61,6 +78,8 @@ typedef struct Gtpv1uExtHeader {
// TS 29.281, fig 5.2.1-3
#define PDU_SESSION_CONTAINER (0x85)
+#define NR_RAN_CONTAINER (0x84)
+
// TS 29.281, 5.2.1
#define EXT_HDR_LNTH_OCTET_UNITS (4)
#define NO_MORE_EXT_HDRS (0)
@@ -88,12 +107,14 @@ typedef struct gtpv1u_bearer_s {
typedef struct {
map bearers;
+ teid_t outgoing_teid;
} teidData_t;
typedef struct {
rnti_t rnti;
ebi_t incoming_rb_id;
gtpCallback callBack;
+ teid_t outgoing_teid;
gtpCallbackSDAP callBackSDAP;
int pdusession_id;
} rntiData_t;
@@ -137,17 +158,18 @@ instance_t legacyInstanceMapping=0;
#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT?legacyInstanceMapping:a)
#define GTPV1U_HEADER_SIZE (8)
-
-
-static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, int msgType, teid_t teid, uint8_t *Msg,int msgLen,
- bool seqNumFlag, bool npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType) {
- AssertFatal(extHdrFlag==false,"Not developped");
+
+
+ static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, int msgType, teid_t teid, uint8_t *Msg,int msgLen,
+ bool seqNumFlag, bool npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType,
+ uint8_t *extensionHeader_buffer, uint8_t extensionHeader_length) {
+ LOG_D(GTPU, "Peer IP:%u peer port:%u outgoing teid:%u \n", peerIp, peerPort, teid);
int headerAdditional=0;
if ( seqNumFlag || npduNumFlag || extHdrFlag)
headerAdditional=4;
- int fullSize=GTPV1U_HEADER_SIZE+headerAdditional+msgLen;
+ int fullSize=GTPV1U_HEADER_SIZE+headerAdditional+msgLen+extensionHeader_length;
uint8_t buffer[fullSize];
Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *)buffer ;
// N should be 0 for us (it was used only in 2G and 3G)
@@ -159,20 +181,42 @@ static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, int
msgHdr->PT=1;
msgHdr->version=1;
msgHdr->msgType=msgType;
- msgHdr->msgLength=htons(msgLen);
+ msgHdr->msgLength=htons(msgLen+extensionHeader_length);
if ( seqNumFlag || extHdrFlag || npduNumFlag)
- msgHdr->msgLength+=4;
+ msgHdr->msgLength+=htons(4);
msgHdr->teid=htonl(teid);
if(seqNumFlag || extHdrFlag || npduNumFlag) {
- *((uint16_t *) (buffer+8)) = seqNumFlag ? htons(seqNum) : 0x0000;
- *((uint8_t *) (buffer+10)) = npduNumFlag ? htons(npduNum) : 0x00;
- *((uint8_t *) (buffer+11)) = extHdrFlag ? htons(extHdrType) : 0x00;
+ *((uint16_t *) (buffer+8)) = seqNumFlag ? seqNum : 0x0000;
+ *((uint8_t *) (buffer+10)) = npduNumFlag ? npduNum : 0x00;
+ *((uint8_t *) (buffer+11)) = extHdrFlag ? extHdrType : 0x00;
+
+ /**(buffer+8) = seqNumFlag ? htons(seqNum) : 0x0000;
+ *(buffer+10) = npduNumFlag ? htons(npduNum) : 0x00;
+ *(buffer+11) = extHdrFlag ? htons(extHdrType) : 0x00;
+ *(buffer+11) = extHdrType;*/
+ }
+
+ if(extHdrFlag){
+ while (extHdrType){
+ if (extensionHeader_length > 0 && extHdrType == 0x84){
+ memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional, extensionHeader_buffer, extensionHeader_length);
+ LOG_D(GTPU, "Extension Header for DDD added. The length is: %d, extension header type is: %x \n", extensionHeader_length, *((uint8_t *) (buffer+11)));
+ extHdrType = extensionHeader_buffer[extensionHeader_length -1];
+ LOG_D(GTPU, "Next extension header type is: %x \n", *((uint8_t *) (buffer+11)));
+ }
+ else {
+ LOG_W(GTPU, "Extension header type not supported, returning... \n");
+ return GTPNOK;
+ }
+ }
+ }
+ if (Msg!= NULL){
+ memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional+extensionHeader_length, Msg, msgLen);
}
- memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional, Msg, msgLen);
// Fix me: add IPv6 support, using flag ipVersion
static struct sockaddr_in to= {0};
to.sin_family = AF_INET;
@@ -230,7 +274,7 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
tmp.outgoing_port,
GTP_GPDU,
tmp.teid_outgoing,
- buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ;
+ buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0, NULL, 0) ;
}
static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) {
@@ -273,7 +317,75 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
tmp.outgoing_port,
GTP_GPDU,
tmp.teid_outgoing,
- buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ;
+ buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0, NULL, 0) ;
+}
+
+static void fillDlDeliveryStatusReport(extensionHeader_t *extensionHeader, uint32_t RLC_buffer_availability, uint32_t NR_PDCP_PDU_SN){
+
+ extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+(NR_PDCP_PDU_SN>0?3:0)+(NR_PDCP_PDU_SN>0?1:0)+1)/4;
+ DlDataDeliveryStatus_flagsT DlDataDeliveryStatus;
+ DlDataDeliveryStatus.deliveredPdcpSn = 0;
+ DlDataDeliveryStatus.transmittedPdcpSn= NR_PDCP_PDU_SN>0?1:0;
+ DlDataDeliveryStatus.pduType = 1;
+ DlDataDeliveryStatus.drbBufferSize = htonl(RLC_buffer_availability);
+ memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT));
+ uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1;
+
+ if(NR_PDCP_PDU_SN>0){
+ extensionHeader->buffer[offset] = (NR_PDCP_PDU_SN >> 16) & 0xff;
+ extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff;
+ extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff;
+ LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]);
+ extensionHeader->buffer[offset+3] = 0x00; //Padding octet
+ offset = offset+3;
+ }
+ extensionHeader->buffer[offset] = 0x00; //No more extension headers
+ /*Total size of DDD_status PDU = size of mandatory part +
+ * 3 octets for highest transmitted/delivered PDCP SN +
+ * 1 octet for padding + 1 octet for next extension header type,
+ * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+ extensionHeader->length = 1+sizeof(DlDataDeliveryStatus_flagsT)+
+ (NR_PDCP_PDU_SN>0?3:0)+
+ (NR_PDCP_PDU_SN>0?1:0)+1;
+}
+
+static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_report_req_t *req){
+ rnti_t rnti=req->rnti;
+ int rab_id=req->pdusession_id;
+ pthread_mutex_lock(&globGtp.gtp_lock);
+ auto inst=&globGtp.instances[compatInst(instance)];
+ auto ptrRnti=inst->ue2te_mapping.find(rnti);
+
+ if ( ptrRnti==inst->ue2te_mapping.end() ) {
+ LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
+ pthread_mutex_unlock(&globGtp.gtp_lock);
+ return;
+ }
+
+ map::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
+
+ if ( ptr2 == ptrRnti->second.bearers.end() ) {
+ LOG_D(GTPU,"GTP-U instance: %ld sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
+ pthread_mutex_unlock(&globGtp.gtp_lock);
+ return;
+ }
+
+ extensionHeader_t *extensionHeader;
+ extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t));
+ fillDlDeliveryStatusReport(extensionHeader, req->buffer_availability,0);
+
+ LOG_I(GTPU,"[%ld] GTP-U sending DL Data Delivery status to RNTI:RAB:teid %x/%x/%x, oldseq %d, oldnum %d\n",
+ instance, rnti, rab_id,ptr2->second.teid_outgoing, ptr2->second.seqNum,ptr2->second.npduNum );
+ // copy to release the mutex
+ gtpv1u_bearer_t tmp=ptr2->second;
+ pthread_mutex_unlock(&globGtp.gtp_lock);
+ gtpv1uCreateAndSendMsg(compatInst(instance),
+ tmp.outgoing_ip_addr,
+ tmp.outgoing_port,
+ GTP_GPDU,
+ tmp.teid_outgoing,
+ NULL, 0, false, false, true, 0, 0, 0x84, extensionHeader->buffer, extensionHeader->length) ;
+
}
static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req) {
@@ -478,6 +590,8 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
inst->te2ue_mapping[incoming_teid].incoming_rb_id= incoming_bearer_id;
+ inst->te2ue_mapping[incoming_teid].outgoing_teid= outgoing_teid;
+
inst->te2ue_mapping[incoming_teid].callBack=callBack;
inst->te2ue_mapping[incoming_teid].callBackSDAP = sdap_data_req;
@@ -740,8 +854,8 @@ static int Gtpv1uHandleEchoReq(int h,
LOG_D(GTPU, "[%d] Received a echo request, TEID: %d, seq: %hu\n", h, msgHdr->teid, seq);
uint8_t recovery[2]= {14,0};
return gtpv1uCreateAndSendMsg(h, peerIp, peerPort, GTP_ECHO_RSP, ntohl(msgHdr->teid),
- recovery, sizeof recovery,
- 1, 0, 0, seq, 0, 0);
+ recovery, sizeof recovery,
+ 1, 0, 0, seq, 0, 0, NULL, 0);
}
static int Gtpv1uHandleError(int h,
@@ -850,26 +964,63 @@ static int Gtpv1uHandleGpdu(int h,
return GTPNOK;
}
- int offset=sizeof(Gtpv1uMsgHeaderT);
+ /* see TS 29.281 5.1 */
+ //Minimum length of GTP-U header if non of the optional fields are present
+ int offset = sizeof(Gtpv1uMsgHeaderT);
uint8_t qfi = 0;
boolean_t rqi = FALSE;
+ uint32_t NR_PDCP_PDU_SN = 0;
- if( msgHdr->E || msgHdr->S || msgHdr->PN){
- Gtpv1uMsgHeaderOptFieldsT *msgHdrOpt = (Gtpv1uMsgHeaderOptFieldsT *)(msgBuf+offset);
- offset+=sizeof(Gtpv1uMsgHeaderOptFieldsT);
- if( msgHdr->E && msgHdrOpt->NextExtHeaderType == PDU_SESSION_CONTAINER){
- Gtpv1uExtHeaderT *msgHdrExt = (Gtpv1uExtHeaderT *)(msgBuf+offset);
- offset+=msgHdrExt->ExtHeaderLen*EXT_HDR_LNTH_OCTET_UNITS;
- qfi = msgHdrExt->pdusession_cntr.QFI;
- rqi = msgHdrExt->pdusession_cntr.RQI;
+ /* if E, S, or PN is set then there are 4 more bytes of header */
+ if( msgHdr->E || msgHdr->S ||msgHdr->PN)
+ offset += 4;
- /*
- * Check if the next extension header type of GTP extension header is set to 0
- * We can not put it in the struct Gtpv1uExtHeaderT because the length is dynamic.
- */
- if(*(msgBuf+offset-1) != NO_MORE_EXT_HDRS)
- LOG_W(GTPU, "Warning - Next extension header is not zero, handle it \n");
+ if (msgHdr->E) {
+ int next_extension_header_type = msgBuf[offset - 1];
+ int extension_header_length;
+
+ while (next_extension_header_type != NO_MORE_EXT_HDRS) {
+ extension_header_length = msgBuf[offset];
+ switch (next_extension_header_type) {
+ case PDU_SESSION_CONTAINER: {
+ PDUSessionContainerT *pdusession_cntr = (PDUSessionContainerT *)(msgBuf + offset + 1);
+ qfi = pdusession_cntr->QFI;
+ rqi = pdusession_cntr->RQI;
+ break;
+ }
+ case NR_RAN_CONTAINER: {
+ uint8_t PDU_type = (msgBuf[offset+1]>>4) & 0x0f;
+ if (PDU_type == 0){ //DL USER Data Format
+ int additional_offset = 6; //Additional offset capturing the first non-mandatory octet (TS 38.425, Figure 5.5.2.1-1)
+ if(msgBuf[offset+1]>>2 & 0x1){ //DL Discard Blocks flag is present
+ LOG_I(GTPU, "DL User Data: DL Discard Blocks handling not enabled\n");
+ additional_offset = additional_offset + 9; //For the moment ignore
+ }
+ if(msgBuf[offset+1]>>1 & 0x1){ //DL Flush flag is present
+ LOG_I(GTPU, "DL User Data: DL Flush handling not enabled\n");
+ additional_offset = additional_offset + 3; //For the moment ignore
+ }
+ if((msgBuf[offset+2]>>3)& 0x1){ //"Report delivered" enabled (TS 38.425, 5.4)
+ /*Store the NR PDCP PDU SN for which a delivery status report shall be generated once the
+ *PDU gets forwarded to the lower layers*/
+ //NR_PDCP_PDU_SN = msgBuf[offset+6] << 16 | msgBuf[offset+7] << 8 | msgBuf[offset+8];
+ NR_PDCP_PDU_SN = msgBuf[offset+additional_offset] << 16 | msgBuf[offset+additional_offset+1] << 8 | msgBuf[offset+additional_offset+2];
+ LOG_D(GTPU, " NR_PDCP_PDU_SN: %u \n", NR_PDCP_PDU_SN);
+ }
+ }
+ else{
+ LOG_W(GTPU, "NR-RAN container type: %d not supported \n", PDU_type);
+ }
+ break;
+ }
+ default:
+ LOG_W(GTPU, "unhandled extension 0x%2.2x, skipping\n", next_extension_header_type);
+ break;
+ }
+
+ offset += extension_header_length * EXT_HDR_LNTH_OCTET_UNITS;
+ next_extension_header_type = msgBuf[offset - 1];
}
}
@@ -925,6 +1076,44 @@ static int Gtpv1uHandleGpdu(int h,
LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
}
+ if(NR_PDCP_PDU_SN > 0 && NR_PDCP_PDU_SN %5 ==0){
+ LOG_D (GTPU, "Create and send DL DATA Delivery status for the previously received PDU, NR_PDCP_PDU_SN: %u \n", NR_PDCP_PDU_SN);
+ int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(ctxt.rnti, rb_id);
+ LOG_D(GTPU, "Available buffer size in RLC for Tx: %d \n", rlc_tx_buffer_space);
+ /*Total size of DDD_status PDU = 1 octet to report extension header length
+ * size of mandatory part + 3 octets for highest transmitted/delivered PDCP SN
+ * 1 octet for padding + 1 octet for next extension header type,
+ * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+ extensionHeader_t *extensionHeader;
+ extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t)) ;
+ extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1)/4;
+ DlDataDeliveryStatus_flagsT DlDataDeliveryStatus;
+ DlDataDeliveryStatus.deliveredPdcpSn = 0;
+ DlDataDeliveryStatus.transmittedPdcpSn= 1;
+ DlDataDeliveryStatus.pduType = 1;
+ DlDataDeliveryStatus.drbBufferSize = htonl(rlc_tx_buffer_space); //htonl(10000000); //hardcoded for now but normally we should extract it from RLC
+ memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT));
+ uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1;
+
+ extensionHeader->buffer[offset] = (NR_PDCP_PDU_SN >> 16) & 0xff;
+ extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff;
+ extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff;
+ LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]);
+ extensionHeader->buffer[offset+3] = 0x00; //Padding octet
+ extensionHeader->buffer[offset+4] = 0x00; //No more extension headers
+ /*Total size of DDD_status PDU = size of mandatory part +
+ * 3 octets for highest transmitted/delivered PDCP SN +
+ * 1 octet for padding + 1 octet for next extension header type,
+ * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+ extensionHeader->length = 1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1;
+ gtpv1uCreateAndSendMsg(h,
+ peerIp,
+ peerPort,
+ GTP_GPDU,
+ inst->te2ue_mapping[ntohl(msgHdr->teid)].outgoing_teid,
+ NULL, 0, false, false, true, 0, 0, 0x84, extensionHeader->buffer, extensionHeader->length) ;
+ }
+
LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h,
msgBufLen-offset,
ntohl(msgHdr->teid));
@@ -1009,6 +1198,12 @@ void *gtpv1uTask(void *args) {
}
break;
+ case GTPV1U_DU_BUFFER_REPORT_REQ:{
+ gtpv1uSendDlDeliveryStatus(compatInst(ITTI_MSG_DESTINATION_INSTANCE(message_p)),
+ >PV1U_DU_BUFFER_REPORT_REQ(message_p));
+ }
+ break;
+
case TERMINATE_MESSAGE:
break;
diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h
index 17882ebf1e..dd52481729 100644
--- a/openair3/ocp-gtpu/gtp_itf.h
+++ b/openair3/ocp-gtpu/gtp_itf.h
@@ -43,6 +43,11 @@ typedef struct openAddr_s {
instance_t originInstance;
} openAddr_t;
+typedef struct extensionHeader_s{
+ uint8_t buffer[500];
+ uint8_t length;
+}extensionHeader_t;
+
// the init function create a gtp instance and return the gtp instance id
// the parameter originInstance will be sent back in each message from gtp to the creator
void gtpv1uReceiver(int h);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
index d14267dcd8..c8e109d302 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
@@ -22,7 +22,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
index 52e4eec30e..a4c877a7ba 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index ab435c9686..e5478983cf 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index a04e0e6123..efa0d3e2fa 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index 426f9e782b..8a2ce9f63e 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 216728577a..616f86a1cd 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 59d466656c..0818fe11d7 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
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
index 6af1356088..022f17e490 100644
--- 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
@@ -21,9 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
min_rxtxtime = 6;
servingCellConfigCommon = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
index 2ae4df07d9..5c636af06c 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index 21267870bd..812ac8dafb 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
index a0fd0bda9f..781384a789 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
@@ -20,8 +20,6 @@ gNBs =
tr_s_preference = "local_mac"
////////// Physical parameters:
-
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
index 5c8f90d9b5..1450c45eee 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index 7bf3626870..562e2b16ab 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index 909c54b858..a8ecb8c4b6 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index d0f394be16..10122b9eb2 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 0438e61337..20d01c2a00 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -20,8 +20,6 @@ gNBs =
tr_s_preference = "local_mac"
////////// Physical parameters:
-
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index 66c2151eb8..44f3889eec 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
index c6ea066fc4..fbafef81b4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
index fcfe58a3c0..38d6ed3c61 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
index 2ad9757cb1..b7da7b17f4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index 44074f3fd9..9f78716bcc 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
index 7ce150506f..1dcef89736 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index 306e652eaa..9a3fe358a5 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
index d08c0f14a0..9e1ae24d67 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -21,8 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
-
servingCellConfigCommon = (
{
#spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
index e3204db8fa..9ec28b93e7 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
@@ -20,8 +20,6 @@ gNBs =
tr_s_preference = "local_mac"
////////// Physical parameters:
-
- ssb_SubcarrierOffset = 31; //0;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
index 030dc10226..35778ef705 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
@@ -21,7 +21,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 31; //0;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
index 6aacd98c7f..a64a4c6022 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
@@ -44,7 +44,6 @@ gNBs =
local_s_portd = 2152;
remote_s_portc = 500;
remote_s_portd = 2152;
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
index f95bdf91ae..4309c13dd3 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
@@ -36,7 +36,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
index f91683897f..cb90889b52 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
@@ -36,7 +36,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
servingCellConfigCommon = (
{
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 cd84e699c7..42aa555771 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
@@ -28,9 +28,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- min_rxtxtime = 2;
- do_CSIRS = 1;
do_SRS = 1;
pdcch_ConfigSIB1 = (
@@ -342,4 +339,7 @@ log_config :
ngap_log_level ="debug";
f1ap_log_level ="debug";
};
+<<<<<<< HEAD
+=======
+>>>>>>> origin/develop
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
index ff64fe718a..6abf2c19cc 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
@@ -32,9 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
min_rxtxtime = 6;
pdcch_ConfigSIB1 = (
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 ef34e68934..470cc13906 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
@@ -28,7 +28,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
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
index 74f2f9c11c..8ff83b5d02 100644
--- 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
@@ -32,10 +32,9 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 4;
+ pdsch_AntennaPorts_XP = 2;
+ pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 4;
- sib1_tda = 0;
pdcch_ConfigSIB1 = (
{
@@ -73,15 +72,6 @@ gNBs =
#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
@@ -136,19 +126,6 @@ gNBs =
# 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;
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 eceb7c1755..14ac07443a 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
@@ -28,7 +28,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
min_rxtxtime = 2;
do_CSIRS = 1;
do_SRS = 1;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
index 8ca0c08876..6719a5534d 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
@@ -30,7 +30,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdcch_ConfigSIB1 = (
{
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 e3ecf87ca0..5f8bf45232 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
@@ -27,7 +27,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 1;
pusch_AntennaPorts = 2;
do_CSIRS = 0;
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
index 763396998d..1f1f64ce3f 100644
--- 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
@@ -27,7 +27,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 1;
pusch_AntennaPorts = 2;
do_CSIRS = 0;
@@ -318,4 +317,4 @@ log_config :
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.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
index bd3076a014..ad1471339a 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
@@ -32,9 +32,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
- pdsch_AntennaPorts = 1;
- pusch_AntennaPorts = 1;
sib1_tda = 15;
min_rxtxtime = 6;
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
index 3d93f2cfab..24090bef85 100644
--- 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
@@ -27,7 +27,6 @@ gNBs =
////////// Physical parameters:
- ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts_XP = 1;
pusch_AntennaPorts = 2;
do_CSIRS = 0;
@@ -318,4 +317,4 @@ log_config :
rrc_log_level ="info";
ngap_log_level ="debug";
f1ap_log_level ="debug";
-};
\ No newline at end of file
+};