diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d206329fd122a2d529cf4281fa7563c181e07a1..b54130b30a9e3b6601e4caccbb9d718cb2645335 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1578,7 +1578,7 @@ add_library(L2 ${ENB_APP_SRC} ${MCE_APP_SRC} ) -target_link_libraries(L2 PRIVATE f1ap x2ap s1ap lte_rrc m2ap) +target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap) target_link_libraries(L2 PRIVATE asn1_nr_rrc asn1_lte_rrc) add_library(MAC_NR ${MAC_NR_SRC}) @@ -2158,7 +2158,6 @@ add_executable(lte-softmodem ${OPENAIR_DIR}/radio/COMMON/record_player.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/F1AP/dummy_enb.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c @@ -2174,7 +2173,7 @@ add_dependencies(lte-softmodem oai_iqplayer) target_link_libraries(lte-softmodem PRIVATE -Wl,--start-group - lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U f1ap SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB + lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB ${RAL_LIB} ${NAS_UE_LIB} ITTI SIMU -Wl,--end-group z dl) @@ -2213,7 +2212,7 @@ add_dependencies(ocp-enb oai_iqplayer coding params_libconfig rfsimulator) target_link_libraries (ocp-enb -Wl,--start-group - lte_rrc nr_rrc s1ap f1ap m2ap x2ap m3ap GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB + lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU ${RAL_LIB} ${NAS_UE_LIB} ITTI -Wl,--end-group z dl) @@ -2242,7 +2241,7 @@ target_link_libraries(oairu PRIVATE asn1_nr_rrc asn1_lte_rrc) # force the generation of ASN.1 so that we don't need to wait during the build target_link_libraries(lte-softmodem PRIVATE - asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap asn1_f1ap) + asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap) # lte-uesoftmodem is UE implementation @@ -2287,7 +2286,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc asn1_lte_rrc) # force the generation of ASN.1 so that we don't need to wait during the build target_link_libraries(lte-uesoftmodem PRIVATE - asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap asn1_f1ap) + asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap) # nr-softmodem ################################################### diff --git a/doc/Doxyfile b/doc/Doxyfile index c839eabf84903743267ae3f62f67826b035fb122..1fb88bba746a45a0832be755050cbeae4b91c603 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -1003,7 +1003,6 @@ INPUT = \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_du_task.h \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_du_interface_management.h \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_du_ue_context_management.h \ -@CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/dummy_enb.c \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_cu_rrc_message_transfer.h \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_cu_warning_message_transmission.c \ @CMAKE_CURRENT_SOURCE_DIR@/../openair2/F1AP/f1ap_cu_task.h \ diff --git a/executables/create_tasks.c b/executables/create_tasks.c index 4bbda1e876ef9910bd49fddb7e9852390c5a81cc..97e8880e9c15bf55ccdb7f758da1817739e03d39 100644 --- a/executables/create_tasks.c +++ b/executables/create_tasks.c @@ -34,8 +34,6 @@ #include "lteRALenb.h" #endif #include "RRC/LTE/rrc_defs.h" -# include "f1ap_cu_task.h" -# include "f1ap_du_task.h" # include "enb_app.h" # include "openair2/LAYER2/MAC/mac_proto.h" #include <executables/split_headers.h> @@ -45,7 +43,6 @@ extern RAN_CONTEXT_t RC; int create_tasks(uint32_t enb_nb) { LOG_D(ENB_APP, "%s(enb_nb:%d\n", __FUNCTION__, enb_nb); - ngran_node_t type = RC.rrc[0]->node_type; int rc; if (enb_nb == 0) return 0; @@ -60,7 +57,7 @@ int create_tasks(uint32_t enb_nb) { AssertFatal(rc >= 0, "Create task for SCTP failed\n"); } - if (EPC_MODE_ENABLED && !NODE_IS_DU(type) && ! ( split73==SPLIT73_DU ) ) { + if (EPC_MODE_ENABLED && ! ( split73==SPLIT73_DU ) ) { rc = itti_create_task(TASK_S1AP, s1ap_eNB_task, NULL); AssertFatal(rc >= 0, "Create task for S1AP failed\n"); rc = itti_create_task(TASK_GTPV1_U, gtpv1uTask, NULL); @@ -74,17 +71,5 @@ int create_tasks(uint32_t enb_nb) { LOG_I(X2AP, "X2AP is disabled.\n"); } - if (NODE_IS_CU(type)) { - rc = itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL); - AssertFatal(rc >= 0, "Create task for CU F1AP failed\n"); - } - - if (NODE_IS_DU(type)) { - rc = itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL); - AssertFatal(rc >= 0, "Create task for DU F1AP failed\n"); - rc = itti_create_task(TASK_GTPV1_U, gtpv1uTask, NULL); - AssertFatal(rc >= 0, "Create task for GTPV1U failed\n"); - } - return 0; } diff --git a/executables/create_tasks_mbms.c b/executables/create_tasks_mbms.c index 73495d871330695d1ce2c5b274361c3928a59324..368d9453baef6b0d0c84c0b69bc760bda2da145f 100644 --- a/executables/create_tasks_mbms.c +++ b/executables/create_tasks_mbms.c @@ -38,8 +38,6 @@ #include "lteRALenb.h" #endif #include "RRC/LTE/rrc_defs.h" -# include "f1ap_cu_task.h" -# include "f1ap_du_task.h" # include "enb_app.h" # include "mce_app.h" # include "mme_app.h" @@ -49,7 +47,6 @@ int create_tasks_mbms(uint32_t enb_nb) { // LOG_D(ENB_APP, "%s(enb_nb:%d\n", __FUNCTION__, enb_nb); - // ngran_node_t type = RC.rrc[0]->node_type; AssertFatal(!get_softmodem_params()->nsa, "In NSA mode\n"); int rc; @@ -80,17 +77,6 @@ int create_tasks_mbms(uint32_t enb_nb) { rc = itti_create_task(TASK_GTPV1_U, gtpv1uTask, NULL); AssertFatal(rc >= 0, "Create task for GTPV1U failed\n"); } -/// -// if (NODE_IS_CU(type)) { -// rc = itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL); -// AssertFatal(rc >= 0, "Create task for CU F1AP failed\n"); -// } -// -// if (NODE_IS_DU(type)) { -// rc = itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL); -// AssertFatal(rc >= 0, "Create task for DU F1AP failed\n"); -// } -// if (is_m3ap_MCE_enabled()) { rc = itti_create_task(TASK_M3AP_MCE, m3ap_MCE_task, NULL); diff --git a/executables/lte-softmodem.c b/executables/lte-softmodem.c index b0baa5a8d2bdebfe88f8f897db2f32feab93e8ae..bdfa4c2335d0b225cd781fef3144adb16d447427 100644 --- a/executables/lte-softmodem.c +++ b/executables/lte-softmodem.c @@ -170,6 +170,24 @@ double cpuf; int oaisim_flag=0; +/* hardcoded into gtp_itf.cpp */ +bool sdap_data_req(protocol_ctxt_t *ctxt_p, + const ue_id_t ue_id, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi, + const int pdusession_id) +{ + abort(); +} /* forward declarations */ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]); @@ -383,26 +401,21 @@ void terminate_task(module_id_t mod_id, task_id_t from, task_id_t to) { extern void free_transport(PHY_VARS_eNB *); extern void phy_free_RU(RU_t *); -static void init_pdcp(void) { - if (!NODE_IS_DU(RC.rrc[0]->node_type)) { - pdcp_layer_init(); - uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? - (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; +static void init_pdcp(void) +{ + pdcp_layer_init(); + uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? + (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; - if (IS_SOFTMODEM_NOS1) - pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; + if (IS_SOFTMODEM_NOS1) + pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; - pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_W_MBMS_BIT; + pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_W_MBMS_BIT; - pdcp_module_init(pdcp_initmask, 0); + pdcp_module_init(pdcp_initmask, 0); - if (NODE_IS_CU(RC.rrc[0]->node_type)) { - pdcp_set_rlc_data_req_func(cu_send_to_du); - } else { - pdcp_set_rlc_data_req_func(rlc_data_req); - pdcp_set_pdcp_data_ind_func(pdcp_data_ind); - } - } + pdcp_set_rlc_data_req_func(rlc_data_req); + pdcp_set_pdcp_data_ind_func(pdcp_data_ind); } static void wait_nfapi_init(char *thread_name) { @@ -420,7 +433,6 @@ int main ( int argc, char **argv ) { int CC_id = 0; int ru_id; - int node_type = ngran_eNB; start_background_system(); @@ -469,8 +481,7 @@ int main ( int argc, char **argv ) } if (RC.nb_inst > 0) { - /* initializes PDCP and sets correct RLC Request/PDCP Indication callbacks - * for monolithic/F1 modes */ + /* initializes PDCP and sets correct RLC Request/PDCP Indication callbacks */ init_pdcp(); if (create_tasks(1) < 0) { @@ -484,10 +495,9 @@ int main ( int argc, char **argv ) itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); rrc_enb_process_itti_msg(NULL); } - node_type = RC.rrc[0]->node_type; } - if (RC.nb_inst > 0 && NODE_IS_CU(node_type)) { + if (RC.nb_inst > 0) { protocol_ctxt_t ctxt; ctxt.module_id = 0 ; ctxt.instance = 0; @@ -498,54 +508,49 @@ int main ( int argc, char **argv ) pdcp_run(&ctxt); } - /* start threads if only L1 or not a CU */ - if (RC.nb_inst == 0 || !NODE_IS_CU(node_type) || NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MODE_VNF) { - // init UE_PF_PO and mutex lock - pthread_mutex_init(&ue_pf_po_mutex, NULL); - memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*MAX_MOBILES_PER_ENB*MAX_NUM_CCs); - mlockall(MCL_CURRENT | MCL_FUTURE); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); + // init UE_PF_PO and mutex lock + pthread_mutex_init(&ue_pf_po_mutex, NULL); + memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*MAX_MOBILES_PER_ENB*MAX_NUM_CCs); + mlockall(MCL_CURRENT | MCL_FUTURE); + pthread_cond_init(&sync_cond,NULL); + pthread_mutex_init(&sync_mutex, NULL); - rt_sleep_ns(10*100000000ULL); + rt_sleep_ns(10*100000000ULL); - if (NFAPI_MODE!=NFAPI_MONOLITHIC) { - LOG_I(ENB_APP,"NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); - } + if (NFAPI_MODE!=NFAPI_MONOLITHIC) { + LOG_I(ENB_APP,"NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); + pthread_cond_init(&sync_cond,NULL); + pthread_mutex_init(&sync_mutex, NULL); + } - if (NFAPI_MODE==NFAPI_MODE_VNF) {// VNF + if (NFAPI_MODE==NFAPI_MODE_VNF) {// VNF #if defined(PRE_SCD_THREAD) - init_ru_vnf(); // ru pointer is necessary for pre_scd. + init_ru_vnf(); // ru pointer is necessary for pre_scd. #endif - wait_nfapi_init("main?"); - } - - LOG_I(ENB_APP,"START MAIN THREADS\n"); - // start the main threads - number_of_cards = 1; - printf("RC.nb_L1_inst:%d\n", RC.nb_L1_inst); - - if (RC.nb_L1_inst > 0) { - printf("Initializing eNB threads single_thread_flag:%d wait_for_sync:%d\n", get_softmodem_params()->single_thread_flag,get_softmodem_params()->wait_for_sync); - init_eNB(get_softmodem_params()->single_thread_flag,get_softmodem_params()->wait_for_sync); - } - for (int x=0; x < RC.nb_L1_inst; x++) - for (int CC_id=0; CC_id<RC.nb_L1_CC[x]; CC_id++) { - L1_rxtx_proc_t *L1proc= &RC.eNB[x][CC_id]->proc.L1_proc; - L1_rxtx_proc_t *L1proctx= &RC.eNB[x][CC_id]->proc.L1_proc_tx; - L1proc->threadPool = (tpool_t *)malloc(sizeof(tpool_t)); - L1proc->respDecode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); - if ( strlen(get_softmodem_params()->threadPoolConfig) > 0 ) - initTpool(get_softmodem_params()->threadPoolConfig, L1proc->threadPool, true); - else - initTpool("n", L1proc->threadPool, true); - initNotifiedFIFO(L1proc->respDecode); - L1proctx->threadPool = L1proc->threadPool; - } + wait_nfapi_init("main?"); + } + LOG_I(ENB_APP,"START MAIN THREADS\n"); + // start the main threads + number_of_cards = 1; + printf("RC.nb_L1_inst:%d\n", RC.nb_L1_inst); + if (RC.nb_L1_inst > 0) { + printf("Initializing eNB threads single_thread_flag:%d wait_for_sync:%d\n", get_softmodem_params()->single_thread_flag,get_softmodem_params()->wait_for_sync); + init_eNB(get_softmodem_params()->single_thread_flag,get_softmodem_params()->wait_for_sync); + } + for (int x=0; x < RC.nb_L1_inst; x++) + for (int CC_id=0; CC_id<RC.nb_L1_CC[x]; CC_id++) { + L1_rxtx_proc_t *L1proc= &RC.eNB[x][CC_id]->proc.L1_proc; + L1_rxtx_proc_t *L1proctx= &RC.eNB[x][CC_id]->proc.L1_proc_tx; + L1proc->threadPool = (tpool_t *)malloc(sizeof(tpool_t)); + L1proc->respDecode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); + if ( strlen(get_softmodem_params()->threadPoolConfig) > 0 ) + initTpool(get_softmodem_params()->threadPoolConfig, L1proc->threadPool, true); + else + initTpool("n", L1proc->threadPool, true); + initNotifiedFIFO(L1proc->respDecode); + L1proctx->threadPool = L1proc->threadPool; } printf("wait_eNBs()\n"); @@ -627,7 +632,7 @@ int main ( int argc, char **argv ) // stop threads #if 0 //Disable clean up because this tends to crash (and unnecessary) - if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { + if (RC.nb_inst == 0) { if(IS_SOFTMODEM_DOSCOPE) end_forms(); diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 2912ec764816014c8578c520b3967352a5faeb44..b9abbf979055ac520903568777ca63df8e6946f1 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -1027,27 +1027,20 @@ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { } void init_pdcp(void) { - if (!NODE_IS_DU(RC.rrc[0]->node_type)) { - pdcp_layer_init(); - uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? - (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; + pdcp_layer_init(); + uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? + (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; - if (IS_SOFTMODEM_NOS1) - pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; + if (IS_SOFTMODEM_NOS1) + pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; - pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_W_MBMS_BIT; + pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_W_MBMS_BIT; - if ( split73!=SPLIT73_DU) - pdcp_module_init(pdcp_initmask, 0); + if ( split73!=SPLIT73_DU) + pdcp_module_init(pdcp_initmask, 0); - if (NODE_IS_CU(RC.rrc[0]->node_type)) { - //pdcp_set_rlc_data_req_func(proto_agent_send_rlc_data_req); - } else { - pdcp_set_rlc_data_req_func(rlc_data_req); - pdcp_set_pdcp_data_ind_func(pdcp_data_ind); - } - } else { - //pdcp_set_pdcp_data_ind_func(proto_agent_send_pdcp_data_ind); + pdcp_set_rlc_data_req_func(rlc_data_req); + pdcp_set_pdcp_data_ind_func(pdcp_data_ind); } } @@ -1074,7 +1067,6 @@ int main ( int argc, char **argv ) { //mtrace(); int i; int CC_id = 0; - int node_type = ngran_eNB; sf_ahead=4; // Bell Labs AssertFatal(load_configmodule(argc,argv,0), "[SOFTMODEM] Error, configuration module init failed\n"); logInit(); @@ -1137,8 +1129,7 @@ int main ( int argc, char **argv ) { if (RC.nb_inst > 0) { /* Start the agent. If it is turned off in the configuration, it won't start */ - /* initializes PDCP and sets correct RLC Request/PDCP Indication callbacks - * for monolithic/F1 modes */ + /* initializes PDCP and sets correct RLC Request/PDCP Indication callbacks */ init_pdcp(); AssertFatal(create_tasks(1)==0,"cannot create ITTI tasks\n"); @@ -1147,11 +1138,9 @@ int main ( int argc, char **argv ) { RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration; itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); } - - node_type = RC.rrc[0]->node_type; } - if (RC.nb_inst > 0 && NODE_IS_CU(node_type)) { + if (RC.nb_inst > 0) { protocol_ctxt_t ctxt; ctxt.module_id = 0 ; ctxt.instance = 0; @@ -1163,7 +1152,7 @@ int main ( int argc, char **argv ) { } /* start threads if only L1 or not a CU */ - if (RC.nb_inst == 0 || !NODE_IS_CU(node_type) || NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MODE_VNF) { + if (RC.nb_inst == 0 || NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MODE_VNF) { // init UE_PF_PO and mutex lock pthread_mutex_init(&ue_pf_po_mutex, NULL); memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*MAX_MOBILES_PER_ENB*MAX_NUM_CCs); @@ -1265,7 +1254,7 @@ int main ( int argc, char **argv ) { LOG_I(ENB_APP,"oai_exit=%d\n",oai_exit); // stop threads - if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { + if (RC.nb_inst == 0) { if(IS_SOFTMODEM_DOSCOPE) end_forms(); diff --git a/openair2/COMMON/m2ap_messages_types.h b/openair2/COMMON/m2ap_messages_types.h index 460dbfc4bb1b7d360b1bdfc856209528e2092944..90d1cd386db608e0f9110cf4efd0bc64c932c33a 100644 --- a/openair2/COMMON/m2ap_messages_types.h +++ b/openair2/COMMON/m2ap_messages_types.h @@ -269,24 +269,14 @@ typedef struct m2ap_setup_resp_s { uint8_t num_mcch_config_per_mbsfn; -// /// string holding gNB_CU_name -// char *gNB_CU_name; -// /// number of DU cells to activate -// uint16_t num_cells_to_activate; //0< num_cells_to_activate <= 512; -// /// mcc of DU cells -// //uint16_t mcc[M2AP_MAX_NB_CELLS]; uint16_t mcc;//[M2AP_MAX_NB_CELLS]; - /// mnc of DU cells - //uint16_t mnc[M2AP_MAX_NB_CELLS]; uint16_t mnc;//[M2AP_MAX_NB_CELLS]; - /// mnc digit length of DU cells - //uint8_t mnc_digit_length[M2AP_MAX_NB_CELLS]; uint8_t mnc_digit_length;//[M2AP_MAX_NB_CELLS]; // NR Global Cell Id // uint64_t nr_cellid[M2AP_MAX_NB_CELLS]; // /// NRPCI // uint16_t nrpci[M2AP_MAX_NB_CELLS]; -// /// num SI messages per DU cell +// /// num SI messages // uint8_t num_SI[M2AP_MAX_NB_CELLS]; // /// SI message containers (up to 21 messages per cell) // uint8_t *SI_container[M2AP_MAX_NB_CELLS][21]; diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 9a0ed3f04a8394797261849de70b3e722dfc904d..7da3d8ece665d4dfa92d6fd8c1e9e5dc9c9c0b02 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -85,7 +85,8 @@ extern RAN_CONTEXT_t RC; //} //*****end M2AP ****/ -static uint32_t eNB_app_register_m2(uint32_t enb_id_start, uint32_t enb_id_end) { +static uint32_t eNB_app_register_m2(uint32_t enb_id_start, uint32_t enb_id_end) +{ uint32_t enb_id; MessageDef *msg_p; uint32_t register_enb_m2_pending = 0; @@ -142,38 +143,27 @@ static uint32_t eNB_app_handle_m2ap_mbms_session_update_req(instance_t instance) /*------------------------------------------------------------------------------*/ -static uint32_t eNB_app_register(ngran_node_t node_type,uint32_t enb_id_start, uint32_t enb_id_end) { +static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end) +{ uint32_t enb_id; MessageDef *msg_p; uint32_t register_enb_pending = 0; for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { - { - if (NODE_IS_DU(node_type)) { // F1AP registration - // configure F1AP here for F1C - LOG_I(ENB_APP,"ngran_eNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n"); - msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, F1AP_SETUP_REQ); - RCconfig_DU_F1(msg_p, enb_id); - - LOG_I(ENB_APP,"[eNB %d] eNB_app_register via F1AP for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); - itti_send_msg_to_task (TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - // configure GTPu here for F1U - } - else { // S1AP registration - /* note: there is an implicit relationship between the data structure and the message name */ - msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, S1AP_REGISTER_ENB_REQ); - RCconfig_S1(msg_p, enb_id); + // S1AP registration + /* note: there is an implicit relationship between the data structure and the message name */ + msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, S1AP_REGISTER_ENB_REQ); + RCconfig_S1(msg_p, enb_id); - if (enb_id == 0) RCconfig_gtpu(); + if (enb_id == 0) + RCconfig_gtpu(); - LOG_I(ENB_APP,"default drx %d\n",((S1AP_REGISTER_ENB_REQ(msg_p)).default_drx)); + LOG_I(ENB_APP, "default drx %d\n", ((S1AP_REGISTER_ENB_REQ(msg_p)).default_drx)); - LOG_I(ENB_APP,"[eNB %d] eNB_app_register via S1AP for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); - itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - } + LOG_I(ENB_APP, "[eNB %d] eNB_app_register via S1AP for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); + itti_send_msg_to_task(TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - register_enb_pending++; - } + register_enb_pending++; } return register_enb_pending; @@ -220,19 +210,18 @@ void *eNB_app_task(void *args_p) { itti_mark_task_ready (TASK_ENB_APP); /* Try to register each eNB */ - // This assumes that node_type of all RRC instances is the same if (EPC_MODE_ENABLED) { - register_enb_pending = eNB_app_register(RC.rrc[0]->node_type, enb_id_start, enb_id_end); + register_enb_pending = eNB_app_register(enb_id_start, enb_id_end); } /* Try to register each eNB with each other */ - if (is_x2ap_enabled() && !NODE_IS_DU(RC.rrc[0]->node_type)) { + if (is_x2ap_enabled()) { x2_register_enb_pending = eNB_app_register_x2 (enb_id_start, enb_id_end); } /* Try to register each eNB with MCE each other */ - if (is_m2ap_eNB_enabled() /*&& !NODE_IS_DU(RC.rrc[0]->node_type)*/) { - //eNB_app_register_MBMS_STA(RC.rrc[0]->node_type, enb_id_start, enb_id_end); + if (is_m2ap_eNB_enabled()) { + //eNB_app_register_MBMS_STA(enb_id_start, enb_id_end); m2_register_enb_pending = eNB_app_register_m2 (enb_id_start, enb_id_end); //if (timer_setup (5, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, @@ -259,7 +248,6 @@ void *eNB_app_task(void *args_p) { break; case S1AP_REGISTER_ENB_CNF: - AssertFatal(!NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received S1AP_REGISTER_ENB_CNF\n"); if (EPC_MODE_ENABLED) { LOG_I(ENB_APP, "[eNB %ld] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); @@ -288,7 +276,7 @@ void *eNB_app_task(void *args_p) { sleep(ENB_REGISTER_RETRY_DELAY); /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (RC.rrc[0]->node_type,enb_id_start, enb_id_end); + register_enb_pending = eNB_app_register(enb_id_start, enb_id_end); } } } @@ -296,50 +284,6 @@ void *eNB_app_task(void *args_p) { break; - case F1AP_SETUP_RESP: - AssertFatal(NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received F1AP_REGISTER_ENB_CNF in CU/eNB\n"); - - LOG_I(ENB_APP, "Received %s: associated ngran_eNB_CU %s with %d cells to activate\n", ITTI_MSG_NAME (msg_p), - F1AP_SETUP_RESP(msg_p).gNB_CU_name,F1AP_SETUP_RESP(msg_p).num_cells_to_activate); - - handle_f1ap_setup_resp(&F1AP_SETUP_RESP(msg_p)); - - DevAssert(register_enb_pending > 0); - register_enb_pending--; - - /* Check if at least eNB is registered with one MME */ - if (F1AP_SETUP_RESP(msg_p).num_cells_to_activate > 0) { - registered_enb++; - } - - /* Check if all register eNB requests have been processed */ - if (register_enb_pending == 0) { - if (registered_enb == enb_nb) { - /* If all eNB cells are registered, start L2L1 task */ - MessageDef *msg_init_p; - - msg_init_p = itti_alloc_new_message (TASK_ENB_APP, 0, INITIALIZE_MESSAGE); - itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p); - - } else { - LOG_W(ENB_APP, " %d eNB not associated with a MME, retrying registration in %d seconds ...\n", - enb_nb - registered_enb, ENB_REGISTER_RETRY_DELAY); - - /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ - if (timer_setup (ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &enb_register_retry_timer_id) < 0) { - LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); - - sleep(ENB_REGISTER_RETRY_DELAY); - /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = eNB_app_register (RC.rrc[0]->node_type,enb_id_start, enb_id_end);//, enb_properties_p); - } - } - } - - break; - case S1AP_DEREGISTERED_ENB_IND: if (EPC_MODE_ENABLED) { LOG_W(ENB_APP, "[eNB %ld] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), @@ -356,7 +300,7 @@ void *eNB_app_task(void *args_p) { if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (RC.rrc[0]->node_type, enb_id_start, enb_id_end); + register_enb_pending = eNB_app_register(enb_id_start, enb_id_end); } if (TIMER_HAS_EXPIRED (msg_p).timer_id == x2_enb_register_retry_timer_id) { @@ -459,20 +403,6 @@ void *eNB_app_task(void *args_p) { case M2AP_SETUP_RESP: LOG_I(ENB_APP,"M2AP_SETUP_RESP RESPONSE received\n"); - // AssertFatal(NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received F1AP_REGISTER_ENB_CNF in CU/eNB\n"); - - // LOG_I(ENB_APP, "Received %s: associated ngran_eNB_CU %s with %d cells to activate\n", ITTI_MSG_NAME (msg_p), - // F1AP_SETUP_RESP(msg_p).gNB_CU_name,F1AP_SETUP_RESP(msg_p).num_cells_to_activate); - // - // handle_f1ap_setup_resp(&F1AP_SETUP_RESP(msg_p)); - - // DevAssert(register_enb_pending > 0); - // register_enb_pending--; - - // /* Check if at least eNB is registered with one MME */ - // if (F1AP_SETUP_RESP(msg_p).num_cells_to_activate > 0) { - // registered_enb++; - // } // /* Check if all register eNB requests have been processed */ // if (register_enb_pending == 0) { @@ -495,7 +425,7 @@ void *eNB_app_task(void *args_p) { // sleep(ENB_REGISTER_RETRY_DELAY); // /* Restart the registration process */ // registered_enb = 0; - // register_enb_pending = eNB_app_register (RC.rrc[0]->node_type,enb_id_start, enb_id_end);//, enb_properties_p); + // register_enb_pending = eNB_app_register(enb_id_start, enb_id_end);//, enb_properties_p); // } // } // } diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index c37581d04ad42dc03424e39d5d93092f95ca7efc..2cdc24152b880711e2b72c2c70cf5c1783a46872 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -165,7 +165,8 @@ void RCconfig_L1(void) { } } -void RCconfig_macrlc(int macrlc_has_f1[MAX_MAC_INST]) { +void RCconfig_macrlc(void) +{ int j; paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC; paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0}; @@ -198,17 +199,6 @@ void RCconfig_macrlc(int macrlc_has_f1[MAX_MAC_INST]) { if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) { // check number of instances is same as RRC/PDCP LOG_I(ENB_APP,"Configuring local RRC for MACRLC\n"); - } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "f1") == 0) { - LOG_I(ENB_APP,"Configuring F1 interfaces for MACRLC\n"); - RC.mac[j]->eth_params_n.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr)); - RC.mac[j]->eth_params_n.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr)); - RC.mac[j]->eth_params_n.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr)); - RC.mac[j]->eth_params_n.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr); - RC.mac[j]->eth_params_n.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr); - RC.mac[j]->eth_params_n.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr); - RC.mac[j]->eth_params_n.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);; - RC.mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE; - macrlc_has_f1[j] = 1; } else { // other midhaul AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr)); } @@ -258,7 +248,7 @@ void RCconfig_macrlc(int macrlc_has_f1[MAX_MAC_INST]) { }*/ } -int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { +int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc) { int num_enbs = 0; int j,k = 0; int32_t enb_id = 0; @@ -320,38 +310,6 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { LOG_I(RRC,"Instance %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr)); - if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0) { - paramdef_t SCTPParams[] = SCTPPARAMS_DESC; - char aprefix[MAX_OPTNAME_SIZE*2 + 8]; - sprintf(aprefix,"%s.[%u].%s",ENB_CONFIG_STRING_ENB_LIST,i,ENB_CONFIG_STRING_SCTP_CONFIG); - config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); - rrc->node_id = *(ENBParamList.paramarray[0][ENB_ENB_ID_IDX].uptr); - LOG_I(ENB_APP,"F1AP: gNB_CU_id[%d] %d\n",k,rrc->node_id); - rrc->node_name = strdup(*(ENBParamList.paramarray[0][ENB_ENB_NAME_IDX].strptr)); - LOG_I(ENB_APP,"F1AP: gNB_CU_name[%d] %s\n",k,rrc->node_name); - rrc->eth_params_s.local_if_name = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr)); - rrc->eth_params_s.my_addr = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr)); - rrc->eth_params_s.remote_addr = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr)); - rrc->eth_params_s.my_portc = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr); - rrc->eth_params_s.remote_portc = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr); - rrc->eth_params_s.my_portd = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr); - rrc->eth_params_s.remote_portd = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr); - rrc->eth_params_s.transp_preference = ETH_UDP_MODE; - rrc->node_type = ngran_eNB_CU; - rrc->sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); - rrc->sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); - } else { - // set to ngran_eNB for now, it will get set to ngran_eNB_DU if macrlc entity which uses F1 is present - // Note: we will have to handle the case of ngran_ng_eNB_DU - if (macrlc_has_f1 == 0) { - rrc->node_type = ngran_eNB; - LOG_I(RRC,"Setting node_type to ngran_eNB\n"); - } else { - rrc->node_type = ngran_eNB_DU; - LOG_I(RRC,"Setting node_type to ngran_eNB_DU\n"); - } - } - rrc->nr_cellid = (uint64_t)*(ENBParamList.paramarray[i][ENB_NRCELLID_IDX].u64ptr); // search if in active list @@ -433,7 +391,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath); //printf("Component carrier %d\n",component_carrier); nb_cc++; - // Cell params, MIB/SIB1 in DU + // Cell params, MIB/SIB1 RRCcfg->tdd_config[j] = ccparams_lte.tdd_config; AssertFatal (ccparams_lte.tdd_config <= LTE_TDD_Config__subframeAssignment_sa6, "Failed to parse eNB configuration file %s, enb %u illegal tdd_config %d (should be 0-%d)!", @@ -516,1492 +474,1345 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { RRCcfg->nb_antenna_ports[j] = ccparams_lte.nb_antenna_ports; - if (!NODE_IS_DU(rrc->node_type)) { //this is CU or eNB, SIB2-20 in CU - // Radio Resource Configuration (SIB2) - RRCcfg->radioresourceconfig[j].prach_root = ccparams_lte.prach_root; - - if ((ccparams_lte.prach_root <0) || (ccparams_lte.prach_root > 1023)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_root choice: 0..1023 !\n", - RC.config_file_name, i, ccparams_lte.prach_root); + // Radio Resource Configuration (SIB2) + RRCcfg->radioresourceconfig[j].prach_root = ccparams_lte.prach_root; - RRCcfg->radioresourceconfig[j].prach_config_index = ccparams_lte.prach_config_index; - - if ((ccparams_lte.prach_config_index <0) || (ccparams_lte.prach_config_index > 63)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", - RC.config_file_name, i, ccparams_lte.prach_config_index); - - if (!ccparams_lte.prach_high_speed) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); - else if (strcmp(ccparams_lte.prach_high_speed, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].prach_high_speed = true; - } else if (strcmp(ccparams_lte.prach_high_speed, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].prach_high_speed = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", - RC.config_file_name, i, ccparams_lte.prach_high_speed); - - RRCcfg->radioresourceconfig[j].prach_zero_correlation = ccparams_lte.prach_zero_correlation; - - if ((ccparams_lte.prach_zero_correlation <0) || - (ccparams_lte.prach_zero_correlation > 15)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", - RC.config_file_name, i, ccparams_lte.prach_zero_correlation); + if ((ccparams_lte.prach_root <0) || (ccparams_lte.prach_root > 1023)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_root choice: 0..1023 !\n", + RC.config_file_name, i, ccparams_lte.prach_root); - RRCcfg->radioresourceconfig[j].prach_freq_offset = ccparams_lte.prach_freq_offset; + RRCcfg->radioresourceconfig[j].prach_config_index = ccparams_lte.prach_config_index; - if ((ccparams_lte.prach_freq_offset <0) || - (ccparams_lte.prach_freq_offset > 94)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", - RC.config_file_name, i, ccparams_lte.prach_freq_offset); + if ((ccparams_lte.prach_config_index <0) || (ccparams_lte.prach_config_index > 63)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", + RC.config_file_name, i, ccparams_lte.prach_config_index); - RRCcfg->radioresourceconfig[j].pucch_delta_shift = ccparams_lte.pucch_delta_shift - 1; + if (!ccparams_lte.prach_high_speed) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); + else if (strcmp(ccparams_lte.prach_high_speed, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].prach_high_speed = true; + } else if (strcmp(ccparams_lte.prach_high_speed, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].prach_high_speed = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, ccparams_lte.prach_high_speed); - if ((ccparams_lte.pucch_delta_shift <1) || - (ccparams_lte.pucch_delta_shift > 3)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", - RC.config_file_name, i, ccparams_lte.pucch_delta_shift); + RRCcfg->radioresourceconfig[j].prach_zero_correlation = ccparams_lte.prach_zero_correlation; - RRCcfg->radioresourceconfig[j].pucch_nRB_CQI = ccparams_lte.pucch_nRB_CQI; + if ((ccparams_lte.prach_zero_correlation <0) || + (ccparams_lte.prach_zero_correlation > 15)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", + RC.config_file_name, i, ccparams_lte.prach_zero_correlation); - if ((ccparams_lte.pucch_nRB_CQI <0) || - (ccparams_lte.pucch_nRB_CQI > 98)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", - RC.config_file_name, i, ccparams_lte.pucch_nRB_CQI); + RRCcfg->radioresourceconfig[j].prach_freq_offset = ccparams_lte.prach_freq_offset; - RRCcfg->radioresourceconfig[j].pucch_nCS_AN = ccparams_lte.pucch_nCS_AN; + if ((ccparams_lte.prach_freq_offset <0) || + (ccparams_lte.prach_freq_offset > 94)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", + RC.config_file_name, i, ccparams_lte.prach_freq_offset); - if ((ccparams_lte.pucch_nCS_AN <0) || - (ccparams_lte.pucch_nCS_AN > 7)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", - RC.config_file_name, i, ccparams_lte.pucch_nCS_AN); + RRCcfg->radioresourceconfig[j].pucch_delta_shift = ccparams_lte.pucch_delta_shift - 1; - RRCcfg->radioresourceconfig[j].pucch_n1_AN = ccparams_lte.pucch_n1_AN; + if ((ccparams_lte.pucch_delta_shift <1) || + (ccparams_lte.pucch_delta_shift > 3)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", + RC.config_file_name, i, ccparams_lte.pucch_delta_shift); - if ((ccparams_lte.pucch_n1_AN <0) || - (ccparams_lte.pucch_n1_AN > 2047)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", - RC.config_file_name, i, ccparams_lte.pucch_n1_AN); + RRCcfg->radioresourceconfig[j].pucch_nRB_CQI = ccparams_lte.pucch_nRB_CQI; - RRCcfg->radioresourceconfig[j].pdsch_referenceSignalPower = ccparams_lte.pdsch_referenceSignalPower; + if ((ccparams_lte.pucch_nRB_CQI <0) || + (ccparams_lte.pucch_nRB_CQI > 98)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", + RC.config_file_name, i, ccparams_lte.pucch_nRB_CQI); - if ((ccparams_lte.pdsch_referenceSignalPower <-60) || - (ccparams_lte.pdsch_referenceSignalPower > 50)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", - RC.config_file_name, i, ccparams_lte.pdsch_referenceSignalPower); + RRCcfg->radioresourceconfig[j].pucch_nCS_AN = ccparams_lte.pucch_nCS_AN; - RRCcfg->radioresourceconfig[j].pdsch_p_b = ccparams_lte.pdsch_p_b; + if ((ccparams_lte.pucch_nCS_AN <0) || + (ccparams_lte.pucch_nCS_AN > 7)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", + RC.config_file_name, i, ccparams_lte.pucch_nCS_AN); - if ((ccparams_lte.pdsch_p_b <0) || - (ccparams_lte.pdsch_p_b > 3)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", - RC.config_file_name, i, ccparams_lte.pdsch_p_b); + RRCcfg->radioresourceconfig[j].pucch_n1_AN = ccparams_lte.pucch_n1_AN; - RRCcfg->radioresourceconfig[j].pusch_n_SB = ccparams_lte.pusch_n_SB; + if ((ccparams_lte.pucch_n1_AN <0) || + (ccparams_lte.pucch_n1_AN > 2047)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", + RC.config_file_name, i, ccparams_lte.pucch_n1_AN); - if ((ccparams_lte.pusch_n_SB <1) || - (ccparams_lte.pusch_n_SB > 4)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", - RC.config_file_name, i, ccparams_lte.pusch_n_SB); + RRCcfg->radioresourceconfig[j].pdsch_referenceSignalPower = ccparams_lte.pdsch_referenceSignalPower; - if (!ccparams_lte.pusch_hoppingMode) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: interSubframe,intraAndInterSubframe!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE); - else if (strcmp(ccparams_lte.pusch_hoppingMode,"interSubFrame")==0) { - RRCcfg->radioresourceconfig[j].pusch_hoppingMode = LTE_PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; - } else if (strcmp(ccparams_lte.pusch_hoppingMode,"intraAndInterSubFrame")==0) { - RRCcfg->radioresourceconfig[j].pusch_hoppingMode = LTE_PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", - RC.config_file_name, i, ccparams_lte.pusch_hoppingMode); + if ((ccparams_lte.pdsch_referenceSignalPower <-60) || + (ccparams_lte.pdsch_referenceSignalPower > 50)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", + RC.config_file_name, i, ccparams_lte.pdsch_referenceSignalPower); - RRCcfg->radioresourceconfig[j].pusch_hoppingOffset = ccparams_lte.pusch_hoppingOffset; + RRCcfg->radioresourceconfig[j].pdsch_p_b = ccparams_lte.pdsch_p_b; - if ((ccparams_lte.pusch_hoppingOffset<0) || - (ccparams_lte.pusch_hoppingOffset>98)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n", - RC.config_file_name, i, ccparams_lte.pusch_hoppingMode); + if ((ccparams_lte.pdsch_p_b <0) || + (ccparams_lte.pdsch_p_b > 3)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", + RC.config_file_name, i, ccparams_lte.pdsch_p_b); - if (!ccparams_lte.pusch_enable64QAM) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); - else if (strcmp(ccparams_lte.pusch_enable64QAM, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_enable64QAM = true; - } else if (strcmp(ccparams_lte.pusch_enable64QAM, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_enable64QAM = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", - RC.config_file_name, i, ccparams_lte.pusch_enable64QAM); + RRCcfg->radioresourceconfig[j].pusch_n_SB = ccparams_lte.pusch_n_SB; - if (!ccparams_lte.pusch_groupHoppingEnabled) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); - else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_groupHoppingEnabled = true; - } else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_groupHoppingEnabled = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", - RC.config_file_name, i, ccparams_lte.pusch_groupHoppingEnabled); + if ((ccparams_lte.pusch_n_SB <1) || + (ccparams_lte.pusch_n_SB > 4)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", + RC.config_file_name, i, ccparams_lte.pusch_n_SB); - RRCcfg->radioresourceconfig[j].pusch_groupAssignment = ccparams_lte.pusch_groupAssignment; + if (!ccparams_lte.pusch_hoppingMode) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: interSubframe,intraAndInterSubframe!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE); + else if (strcmp(ccparams_lte.pusch_hoppingMode,"interSubFrame")==0) { + RRCcfg->radioresourceconfig[j].pusch_hoppingMode = LTE_PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; + } else if (strcmp(ccparams_lte.pusch_hoppingMode,"intraAndInterSubFrame")==0) { + RRCcfg->radioresourceconfig[j].pusch_hoppingMode = LTE_PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", + RC.config_file_name, i, ccparams_lte.pusch_hoppingMode); - if ((ccparams_lte.pusch_groupAssignment<0)|| - (ccparams_lte.pusch_groupAssignment>29)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", - RC.config_file_name, i, ccparams_lte.pusch_groupAssignment); + RRCcfg->radioresourceconfig[j].pusch_hoppingOffset = ccparams_lte.pusch_hoppingOffset; - if (!ccparams_lte.pusch_sequenceHoppingEnabled) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); - else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_sequenceHoppingEnabled = true; - } else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].pusch_sequenceHoppingEnabled = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", - RC.config_file_name, i, ccparams_lte.pusch_sequenceHoppingEnabled); + if ((ccparams_lte.pusch_hoppingOffset<0) || + (ccparams_lte.pusch_hoppingOffset>98)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n", + RC.config_file_name, i, ccparams_lte.pusch_hoppingMode); - RRCcfg->radioresourceconfig[j].pusch_nDMRS1 = ccparams_lte.pusch_nDMRS1; // cyclic_shift in RRC! + if (!ccparams_lte.pusch_enable64QAM) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); + else if (strcmp(ccparams_lte.pusch_enable64QAM, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_enable64QAM = true; + } else if (strcmp(ccparams_lte.pusch_enable64QAM, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_enable64QAM = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, ccparams_lte.pusch_enable64QAM); - if ((ccparams_lte.pusch_nDMRS1 <0) || - (ccparams_lte.pusch_nDMRS1>7)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", - RC.config_file_name, i, ccparams_lte.pusch_nDMRS1); + if (!ccparams_lte.pusch_groupHoppingEnabled) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); + else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_groupHoppingEnabled = true; + } else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_groupHoppingEnabled = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, ccparams_lte.pusch_groupHoppingEnabled); - if (strcmp(ccparams_lte.phich_duration,"NORMAL")==0) { - RRCcfg->radioresourceconfig[j].phich_duration = LTE_PHICH_Config__phich_Duration_normal; - } else if (strcmp(ccparams_lte.phich_duration,"EXTENDED")==0) { - RRCcfg->radioresourceconfig[j].phich_duration = LTE_PHICH_Config__phich_Duration_extended; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", - RC.config_file_name, i, ccparams_lte.phich_duration); - - if (strcmp(ccparams_lte.phich_resource,"ONESIXTH")==0) { - RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_oneSixth; - } else if (strcmp(ccparams_lte.phich_resource,"HALF")==0) { - RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_half; - } else if (strcmp(ccparams_lte.phich_resource,"ONE")==0) { - RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_one; - } else if (strcmp(ccparams_lte.phich_resource,"TWO")==0) { - RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_two; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", - RC.config_file_name, i, ccparams_lte.phich_resource); - - printf("phich.resource %ld (%s), phich.duration %ld (%s)\n", - RRCcfg->radioresourceconfig[j].phich_resource, - ccparams_lte.phich_resource, - RRCcfg->radioresourceconfig[j].phich_duration, - ccparams_lte.phich_duration); - - if (strcmp(ccparams_lte.srs_enable, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_enable = true; - } else if (strcmp(ccparams_lte.srs_enable, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_enable = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", - RC.config_file_name, i, ccparams_lte.srs_enable); + RRCcfg->radioresourceconfig[j].pusch_groupAssignment = ccparams_lte.pusch_groupAssignment; - if (RRCcfg->radioresourceconfig[j].srs_enable == true) { - RRCcfg->radioresourceconfig[j].srs_BandwidthConfig = ccparams_lte.srs_BandwidthConfig; + if ((ccparams_lte.pusch_groupAssignment<0)|| + (ccparams_lte.pusch_groupAssignment>29)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", + RC.config_file_name, i, ccparams_lte.pusch_groupAssignment); - if ((ccparams_lte.srs_BandwidthConfig < 0) || - (ccparams_lte.srs_BandwidthConfig >7)) - AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value %d for srs_BandwidthConfig choice: 0...7\n", - RC.config_file_name, i, ccparams_lte.srs_BandwidthConfig); + if (!ccparams_lte.pusch_sequenceHoppingEnabled) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); + else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_sequenceHoppingEnabled = true; + } else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].pusch_sequenceHoppingEnabled = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, ccparams_lte.pusch_sequenceHoppingEnabled); - RRCcfg->radioresourceconfig[j].srs_SubframeConfig = ccparams_lte.srs_SubframeConfig; + RRCcfg->radioresourceconfig[j].pusch_nDMRS1 = ccparams_lte.pusch_nDMRS1; // cyclic_shift in RRC! - if ((ccparams_lte.srs_SubframeConfig<0) || - (ccparams_lte.srs_SubframeConfig>15)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", - RC.config_file_name, i, ccparams_lte.srs_SubframeConfig); - - if (strcmp(ccparams_lte.srs_ackNackST, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_ackNackST = true; - } else if (strcmp(ccparams_lte.srs_ackNackST, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_ackNackST = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", - RC.config_file_name, i, ccparams_lte.srs_ackNackST); - - if (strcmp(ccparams_lte.srs_MaxUpPts, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_MaxUpPts = true; - } else if (strcmp(ccparams_lte.srs_MaxUpPts, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].srs_MaxUpPts = false; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", - RC.config_file_name, i, ccparams_lte.srs_MaxUpPts); - } + if ((ccparams_lte.pusch_nDMRS1 <0) || + (ccparams_lte.pusch_nDMRS1>7)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", + RC.config_file_name, i, ccparams_lte.pusch_nDMRS1); + + if (strcmp(ccparams_lte.phich_duration,"NORMAL")==0) { + RRCcfg->radioresourceconfig[j].phich_duration = LTE_PHICH_Config__phich_Duration_normal; + } else if (strcmp(ccparams_lte.phich_duration,"EXTENDED")==0) { + RRCcfg->radioresourceconfig[j].phich_duration = LTE_PHICH_Config__phich_Duration_extended; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", + RC.config_file_name, i, ccparams_lte.phich_duration); + + if (strcmp(ccparams_lte.phich_resource,"ONESIXTH")==0) { + RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_oneSixth; + } else if (strcmp(ccparams_lte.phich_resource,"HALF")==0) { + RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_half; + } else if (strcmp(ccparams_lte.phich_resource,"ONE")==0) { + RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_one; + } else if (strcmp(ccparams_lte.phich_resource,"TWO")==0) { + RRCcfg->radioresourceconfig[j].phich_resource = LTE_PHICH_Config__phich_Resource_two; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", + RC.config_file_name, i, ccparams_lte.phich_resource); + + printf("phich.resource %ld (%s), phich.duration %ld (%s)\n", + RRCcfg->radioresourceconfig[j].phich_resource, + ccparams_lte.phich_resource, + RRCcfg->radioresourceconfig[j].phich_duration, + ccparams_lte.phich_duration); + + if (strcmp(ccparams_lte.srs_enable, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_enable = true; + } else if (strcmp(ccparams_lte.srs_enable, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_enable = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, ccparams_lte.srs_enable); - RRCcfg->radioresourceconfig[j].pusch_p0_Nominal = ccparams_lte.pusch_p0_Nominal; + if (RRCcfg->radioresourceconfig[j].srs_enable == true) { + RRCcfg->radioresourceconfig[j].srs_BandwidthConfig = ccparams_lte.srs_BandwidthConfig; - if ((ccparams_lte.pusch_p0_Nominal<-126) || - (ccparams_lte.pusch_p0_Nominal>24)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", - RC.config_file_name, i, ccparams_lte.pusch_p0_Nominal); - - if (strcmp(ccparams_lte.pusch_alpha,"AL0")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al0; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL04")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al04; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL05")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al05; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL06")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al06; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL07")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al07; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL08")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al08; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL09")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al09; - } else if (strcmp(ccparams_lte.pusch_alpha,"AL1")==0) { - RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al1; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", - RC.config_file_name, i, ccparams_lte.pusch_alpha); + if ((ccparams_lte.srs_BandwidthConfig < 0) || + (ccparams_lte.srs_BandwidthConfig >7)) + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value %d for srs_BandwidthConfig choice: 0...7\n", + RC.config_file_name, i, ccparams_lte.srs_BandwidthConfig); - RRCcfg->radioresourceconfig[j].pucch_p0_Nominal = ccparams_lte.pucch_p0_Nominal; + RRCcfg->radioresourceconfig[j].srs_SubframeConfig = ccparams_lte.srs_SubframeConfig; - if ((ccparams_lte.pucch_p0_Nominal<-127) || - (ccparams_lte.pucch_p0_Nominal>-96)) + if ((ccparams_lte.srs_SubframeConfig<0) || + (ccparams_lte.srs_SubframeConfig>15)) AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n", - RC.config_file_name, i, ccparams_lte.pucch_p0_Nominal); - - RRCcfg->radioresourceconfig[j].msg3_delta_Preamble = ccparams_lte.msg3_delta_Preamble; + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", + RC.config_file_name, i, ccparams_lte.srs_SubframeConfig); - if ((ccparams_lte.msg3_delta_Preamble<-1) || - (ccparams_lte.msg3_delta_Preamble>6)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", - RC.config_file_name, i, ccparams_lte.msg3_delta_Preamble); - - if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF_2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF0")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; + if (strcmp(ccparams_lte.srs_ackNackST, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_ackNackST = true; + } else if (strcmp(ccparams_lte.srs_ackNackST, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_ackNackST = false; } else AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", - RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format1); - - if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF1")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF3")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF5")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", - RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format1b); - - if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF_2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF0")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF1")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", - RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2); - - if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF_2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF0")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", - RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2a); - - if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF_2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF0")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; - } else if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF2")==0) { - RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", - RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2b); - - RRCcfg->radioresourceconfig[j].rach_numberOfRA_Preambles = (ccparams_lte.rach_numberOfRA_Preambles / 4) - 1; - - if ((ccparams_lte.rach_numberOfRA_Preambles <4) || - (ccparams_lte.rach_numberOfRA_Preambles>64) || - ((ccparams_lte.rach_numberOfRA_Preambles&3)!=0)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", - RC.config_file_name, i, ccparams_lte.rach_numberOfRA_Preambles); - - if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].rach_preamblesGroupAConfig = true; - RRCcfg->radioresourceconfig[j].rach_sizeOfRA_PreamblesGroupA = (ccparams_lte.rach_sizeOfRA_PreamblesGroupA / 4) - 1; - - if ((ccparams_lte.rach_numberOfRA_Preambles <4) || - (ccparams_lte.rach_numberOfRA_Preambles>60) || - ((ccparams_lte.rach_numberOfRA_Preambles&3)!=0)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", - RC.config_file_name, i, ccparams_lte.rach_sizeOfRA_PreamblesGroupA); - - switch (ccparams_lte.rach_messageSizeGroupA) { - case 56: - RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56; - break; - - case 144: - RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144; - break; - - case 208: - RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208; - break; - - case 256: - RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256; - break; - - default: - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", - RC.config_file_name, i, ccparams_lte.rach_messageSizeGroupA); - break; - } + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, ccparams_lte.srs_ackNackST); - if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"minusinfinity")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB0")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB5")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB8")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB10")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB12")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB15")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15; - } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB18")==0) { - RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; - } else - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", - RC.config_file_name, i, ccparams_lte.rach_messagePowerOffsetGroupB); - } else if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].rach_preamblesGroupAConfig = false; + if (strcmp(ccparams_lte.srs_MaxUpPts, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_MaxUpPts = true; + } else if (strcmp(ccparams_lte.srs_MaxUpPts, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].srs_MaxUpPts = false; } else AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", - RC.config_file_name, i, ccparams_lte.rach_preamblesGroupAConfig); + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, ccparams_lte.srs_MaxUpPts); + } - RRCcfg->radioresourceconfig[j].rach_preambleInitialReceivedTargetPower = (ccparams_lte.rach_preambleInitialReceivedTargetPower + 120) / 2; + RRCcfg->radioresourceconfig[j].pusch_p0_Nominal = ccparams_lte.pusch_p0_Nominal; - if ((ccparams_lte.rach_preambleInitialReceivedTargetPower<-120) || - (ccparams_lte.rach_preambleInitialReceivedTargetPower>-90) || - ((ccparams_lte.rach_preambleInitialReceivedTargetPower&1)!=0)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", - RC.config_file_name, i, ccparams_lte.rach_preambleInitialReceivedTargetPower); + if ((ccparams_lte.pusch_p0_Nominal<-126) || + (ccparams_lte.pusch_p0_Nominal>24)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", + RC.config_file_name, i, ccparams_lte.pusch_p0_Nominal); + + if (strcmp(ccparams_lte.pusch_alpha,"AL0")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al0; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL04")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al04; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL05")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al05; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL06")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al06; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL07")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al07; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL08")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al08; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL09")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al09; + } else if (strcmp(ccparams_lte.pusch_alpha,"AL1")==0) { + RRCcfg->radioresourceconfig[j].pusch_alpha = LTE_Alpha_r12_al1; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", + RC.config_file_name, i, ccparams_lte.pusch_alpha); - RRCcfg->radioresourceconfig[j].rach_powerRampingStep = ccparams_lte.rach_powerRampingStep / 2; + RRCcfg->radioresourceconfig[j].pucch_p0_Nominal = ccparams_lte.pucch_p0_Nominal; - if ((ccparams_lte.rach_powerRampingStep<0) || - (ccparams_lte.rach_powerRampingStep>6) || - ((ccparams_lte.rach_powerRampingStep&1)!=0)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", - RC.config_file_name, i, ccparams_lte.rach_powerRampingStep); - - switch (ccparams_lte.rach_preambleTransMax) { - case 3: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n3; - break; + if ((ccparams_lte.pucch_p0_Nominal<-127) || + (ccparams_lte.pucch_p0_Nominal>-96)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n", + RC.config_file_name, i, ccparams_lte.pucch_p0_Nominal); - case 4: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n4; - break; + RRCcfg->radioresourceconfig[j].msg3_delta_Preamble = ccparams_lte.msg3_delta_Preamble; - case 5: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n5; - break; + if ((ccparams_lte.msg3_delta_Preamble<-1) || + (ccparams_lte.msg3_delta_Preamble>6)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", + RC.config_file_name, i, ccparams_lte.msg3_delta_Preamble); + + if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF_2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF0")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format1,"deltaF2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format1); + + if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF1")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF3")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format1b,"deltaF5")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format1b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", + RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format1b); + + if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF_2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF0")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF1")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2,"deltaF2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2 = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", + RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2); + + if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF_2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF0")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2a,"deltaF2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2a = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2a); + + if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF_2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF0")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; + } else if (strcmp(ccparams_lte.pucch_deltaF_Format2b,"deltaF2")==0) { + RRCcfg->radioresourceconfig[j].pucch_deltaF_Format2b = LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, ccparams_lte.pucch_deltaF_Format2b); - case 6: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n6; - break; + RRCcfg->radioresourceconfig[j].rach_numberOfRA_Preambles = (ccparams_lte.rach_numberOfRA_Preambles / 4) - 1; - case 7: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n7; - break; + if ((ccparams_lte.rach_numberOfRA_Preambles <4) || + (ccparams_lte.rach_numberOfRA_Preambles>64) || + ((ccparams_lte.rach_numberOfRA_Preambles&3)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", + RC.config_file_name, i, ccparams_lte.rach_numberOfRA_Preambles); - case 8: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n8; - break; + if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].rach_preamblesGroupAConfig = true; + RRCcfg->radioresourceconfig[j].rach_sizeOfRA_PreamblesGroupA = (ccparams_lte.rach_sizeOfRA_PreamblesGroupA / 4) - 1; - case 10: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n10; - break; + if ((ccparams_lte.rach_numberOfRA_Preambles <4) || + (ccparams_lte.rach_numberOfRA_Preambles>60) || + ((ccparams_lte.rach_numberOfRA_Preambles&3)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", + RC.config_file_name, i, ccparams_lte.rach_sizeOfRA_PreamblesGroupA); - case 20: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n20; + switch (ccparams_lte.rach_messageSizeGroupA) { + case 56: + RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56; break; - case 50: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n50; + case 144: + RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144; break; - case 100: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n100; + case 208: + RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208; break; - case 200: - RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n200; + case 256: + RRCcfg->radioresourceconfig[j].rach_messageSizeGroupA = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256; break; default: AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", - RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", + RC.config_file_name, i, ccparams_lte.rach_messageSizeGroupA); break; } - RRCcfg->radioresourceconfig[j].rach_raResponseWindowSize = (ccparams_lte.rach_raResponseWindowSize == 10) ? 7 : ccparams_lte.rach_raResponseWindowSize - 2; - - if ((ccparams_lte.rach_raResponseWindowSize<0)|| - (ccparams_lte.rach_raResponseWindowSize==9)|| - (ccparams_lte.rach_raResponseWindowSize>10)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", - RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - - RRCcfg->radioresourceconfig[j].rach_macContentionResolutionTimer = (ccparams_lte.rach_macContentionResolutionTimer / 8) - 1; - - if ((ccparams_lte.rach_macContentionResolutionTimer<8) || - (ccparams_lte.rach_macContentionResolutionTimer>64) || - ((ccparams_lte.rach_macContentionResolutionTimer&7)!=0)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", - RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - - RRCcfg->radioresourceconfig[j].rach_maxHARQ_Msg3Tx = ccparams_lte.rach_maxHARQ_Msg3Tx; - - if ((ccparams_lte.rach_maxHARQ_Msg3Tx<0) || - (ccparams_lte.rach_maxHARQ_Msg3Tx>8)) + if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"minusinfinity")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB0")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB5")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB8")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB10")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB12")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB15")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15; + } else if (strcmp(ccparams_lte.rach_messagePowerOffsetGroupB,"dB18")==0) { + RRCcfg->radioresourceconfig[j].rach_messagePowerOffsetGroupB = LTE_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; + } else AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", - RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - - switch (ccparams_lte.pcch_defaultPagingCycle) { - case 32: - RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf32; - break; - - case 64: - RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf64; - break; - - case 128: - RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf128; - break; + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", + RC.config_file_name, i, ccparams_lte.rach_messagePowerOffsetGroupB); + } else if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].rach_preamblesGroupAConfig = false; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, ccparams_lte.rach_preamblesGroupAConfig); - case 256: - RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf256; - break; + RRCcfg->radioresourceconfig[j].rach_preambleInitialReceivedTargetPower = (ccparams_lte.rach_preambleInitialReceivedTargetPower + 120) / 2; - default: - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", - RC.config_file_name, i, ccparams_lte.pcch_defaultPagingCycle); - break; - } + if ((ccparams_lte.rach_preambleInitialReceivedTargetPower<-120) || + (ccparams_lte.rach_preambleInitialReceivedTargetPower>-90) || + ((ccparams_lte.rach_preambleInitialReceivedTargetPower&1)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", + RC.config_file_name, i, ccparams_lte.rach_preambleInitialReceivedTargetPower); - if (strcmp(ccparams_lte.pcch_nB, "fourT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_fourT; - } else if (strcmp(ccparams_lte.pcch_nB, "twoT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_twoT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneT; - } else if (strcmp(ccparams_lte.pcch_nB, "halfT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_halfT; - } else if (strcmp(ccparams_lte.pcch_nB, "quarterT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_quarterT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneEighthT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneEighthT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneSixteenthT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneSixteenthT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneThirtySecondT") == 0) { - RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneThirtySecondT; - } else { - AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", - RC.config_file_name, - i, - ccparams_lte.pcch_nB); - } + RRCcfg->radioresourceconfig[j].rach_powerRampingStep = ccparams_lte.rach_powerRampingStep / 2; - if (strcmp(ccparams_lte.drx_Config_present, "prNothing") == 0) { - RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_NOTHING; - } else if (strcmp(ccparams_lte.drx_Config_present, "prRelease") == 0) { - RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_release; - } else if (strcmp(ccparams_lte.drx_Config_present, "prSetup") == 0) { - RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_setup; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_Config_present choice: prNothing, prRelease, prSetup!\n", - RC.config_file_name, i, ccparams_lte.drx_Config_present); - } + if ((ccparams_lte.rach_powerRampingStep<0) || + (ccparams_lte.rach_powerRampingStep>6) || + ((ccparams_lte.rach_powerRampingStep&1)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", + RC.config_file_name, i, ccparams_lte.rach_powerRampingStep); - if (strcmp(ccparams_lte.drx_onDurationTimer, "psf1") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf1; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf2") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf2; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf3") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf3; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf4") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf4; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf5") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf5; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf6") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf6; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf8") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf8; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf10") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf10; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf20") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf20; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf30") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf30; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf40") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf40; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf50") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf50; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf60") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf60; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf80") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf80; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf100") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf100; - } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf200") == 0) { - RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf200; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_onDurationTimer choice !\n", - RC.config_file_name, i, ccparams_lte.drx_onDurationTimer); + switch (ccparams_lte.rach_preambleTransMax) { + case 3: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n3; break; - } - if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf2; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf3") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf3; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf4") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf4; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf5") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf5; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf6") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf6; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf8") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf8; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf10") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf10; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf20") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf20; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf30") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf30; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf40") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf40; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf50") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf50; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf60") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf60; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf80") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf80; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf100") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf100; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf200") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf200; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf300") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf300; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf500") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf500; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf750") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf750; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1280") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1280; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1920") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1920; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2560") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf2560; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf0-v1020") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf0_v1020; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare9") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare9; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare8") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare8; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare7") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare7; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare6") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare6; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare5") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare5; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare4") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare4; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare3") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare3; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare2") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare2; - } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare1") == 0) { - RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare1; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_InactivityTimer choice !\n", - RC.config_file_name, i, ccparams_lte.drx_InactivityTimer); + case 4: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n4; break; - } - RRCcfg->radioresourceconfig[j].ue_multiple_max = ccparams_lte.ue_multiple_max; + case 5: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n5; + break; - if (!ccparams_lte.mbms_dedicated_serving_cell) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u define %s: TRUE,FALSE!\n", - RC.config_file_name, i, ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL); - else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "ENABLE") == 0) { - RRCcfg->radioresourceconfig[j].mbms_dedicated_serving_cell = true; - } else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "DISABLE") == 0) { - RRCcfg->radioresourceconfig[j].mbms_dedicated_serving_cell = false; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for mbms_dedicated_serving_cell choice: TRUE or FALSE !\n", - RC.config_file_name, i, ccparams_lte.mbms_dedicated_serving_cell); - } + case 6: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n6; + break; - switch (ccparams_lte.N_RB_DL) { - case 25: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 4)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..4!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + case 7: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n7; + break; - break; + case 8: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n8; + break; - case 50: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 8)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..8!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + case 10: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n10; + break; - break; + case 20: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n20; + break; - case 100: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 16)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..16!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + case 50: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n50; + break; - break; + case 100: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n100; + break; - default: - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n", - RC.config_file_name, i, ccparams_lte.N_RB_DL); - break; - } + case 200: + RRCcfg->radioresourceconfig[j].rach_preambleTransMax = LTE_PreambleTransMax_n200; + break; - if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf1") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf1; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf2") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf2; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf4") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf4; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf6") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf6; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf8") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf8; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf16") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf16; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf24") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf24; - } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf33") == 0) { - RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf33; - } else { + default: AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_RetransmissionTimer choice !\n", - RC.config_file_name, i, ccparams_lte.drx_RetransmissionTimer); + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", + RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); break; - } + } - if (ccparams_lte.drx_longDrx_CycleStartOffset_present == NULL || strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prNothing") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_NOTHING; - } else { - if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf10") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10; - offsetMaxLimit = 10; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf20") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20; - offsetMaxLimit = 20; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf32") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32; - offsetMaxLimit = 32; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf40") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40; - offsetMaxLimit = 40; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf64") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64; - offsetMaxLimit = 64; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf80") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80; - offsetMaxLimit = 80; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf128") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128; - offsetMaxLimit = 128; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf160") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160; - offsetMaxLimit = 160; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf256") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256; - offsetMaxLimit = 256; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf320") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320; - offsetMaxLimit = 320; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf512") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512; - offsetMaxLimit = 512; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf640") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640; - offsetMaxLimit = 640; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1024") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024; - offsetMaxLimit = 1024; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1280") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280; - offsetMaxLimit = 1280; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2048") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048; - offsetMaxLimit = 2048; - } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2560") == 0) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560; - offsetMaxLimit = 2560; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file \"%s\", enb %u unknown string value \"%s\" for drx_longDrx_CycleStartOffset_present choice !\n", - RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset_present); - } + RRCcfg->radioresourceconfig[j].rach_raResponseWindowSize = (ccparams_lte.rach_raResponseWindowSize == 10) ? 7 : ccparams_lte.rach_raResponseWindowSize - 2; - if (ccparams_lte.drx_longDrx_CycleStartOffset >= 0 && ccparams_lte.drx_longDrx_CycleStartOffset < offsetMaxLimit) { - RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset = ccparams_lte.drx_longDrx_CycleStartOffset; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u incoherent value \"%d\" for drx_longDrx_CycleStartOffset !\n", - RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset); - } - } - - if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") == 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer == 0) { - if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") != 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer != 0) { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u incoherent values \"%s\" - \"%d\" for drx_shortDrx_Cycle or drx_shortDrx_ShortCycleTimer choice !\n", - RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle, ccparams_lte.drx_shortDrx_ShortCycleTimer); - } else { - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = -1; - RRCcfg->radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = 0; - } - } else { - if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf2") == 0) { - cycleNb = 2; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf2; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf5") == 0) { - cycleNb = 5; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf5; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf8") == 0) { - cycleNb = 8; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf8; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf10") == 0) { - cycleNb = 10; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf10; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf16") == 0) { - cycleNb = 16; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf16; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf20") == 0) { - cycleNb = 20; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf20; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf32") == 0) { - cycleNb = 32; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf32; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf40") == 0) { - cycleNb = 40; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf40; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf64") == 0) { - cycleNb = 64; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf64; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf80") == 0) { - cycleNb = 80; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf80; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf128") == 0) { - cycleNb = 128; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf128; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf160") == 0) { - cycleNb = 160; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf160; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf256") == 0) { - cycleNb = 256; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf256; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf320") == 0) { - cycleNb = 320; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf320; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf512") == 0) { - cycleNb = 512; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf512; - } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf640") == 0) { - cycleNb = 640; - RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf640; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u incoherent value \"%s\" for drx_shortDrx_Cycle !\n", - RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle); - } + if ((ccparams_lte.rach_raResponseWindowSize<0)|| + (ccparams_lte.rach_raResponseWindowSize==9)|| + (ccparams_lte.rach_raResponseWindowSize>10)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", + RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - if (cycleNb > 0 && (offsetMaxLimit % cycleNb != 0 || cycleNb == offsetMaxLimit)) { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u incompatible (not multiple) values \"%d\" - \"%d\" for drx_shortDrx_Cycle and drx_longDrx_CycleStartOffset choice !\n", - RC.config_file_name, i, cycleNb, offsetMaxLimit); - } + RRCcfg->radioresourceconfig[j].rach_macContentionResolutionTimer = (ccparams_lte.rach_macContentionResolutionTimer / 8) - 1; - if (ccparams_lte.drx_shortDrx_ShortCycleTimer >= 1 && ccparams_lte.drx_shortDrx_ShortCycleTimer <= 16 ) { - RRCcfg->radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = ccparams_lte.drx_shortDrx_ShortCycleTimer; - } else { - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for drx_shortDrx_ShortCycleTimer choice !\n", - RC.config_file_name, i, ccparams_lte.drx_shortDrx_ShortCycleTimer ); - } - } + if ((ccparams_lte.rach_macContentionResolutionTimer<8) || + (ccparams_lte.rach_macContentionResolutionTimer>64) || + ((ccparams_lte.rach_macContentionResolutionTimer&7)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", + RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - switch (ccparams_lte.bcch_modificationPeriodCoeff) { - case 2: - RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n2; - break; + RRCcfg->radioresourceconfig[j].rach_maxHARQ_Msg3Tx = ccparams_lte.rach_maxHARQ_Msg3Tx; - case 4: - RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n4; - break; + if ((ccparams_lte.rach_maxHARQ_Msg3Tx<0) || + (ccparams_lte.rach_maxHARQ_Msg3Tx>8)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", + RC.config_file_name, i, ccparams_lte.rach_preambleTransMax); - case 8: - RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n8; - break; + switch (ccparams_lte.pcch_defaultPagingCycle) { + case 32: + RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf32; + break; - case 16: - RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n16; - break; + case 64: + RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf64; + break; - default: - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", - RC.config_file_name, i, ccparams_lte.bcch_modificationPeriodCoeff); - break; - } + case 128: + RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf128; + break; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t300 = ccparams_lte.ue_TimersAndConstants_t300; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t301 = ccparams_lte.ue_TimersAndConstants_t301; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t310 = ccparams_lte.ue_TimersAndConstants_t310; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t311 = ccparams_lte.ue_TimersAndConstants_t311; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_n310 = ccparams_lte.ue_TimersAndConstants_n310; - RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_n311 = ccparams_lte.ue_TimersAndConstants_n311; + case 256: + RRCcfg->radioresourceconfig[j].pcch_defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf256; + break; - switch (ccparams_lte.ue_TransmissionMode) { - case 1: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm1; - break; + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", + RC.config_file_name, i, ccparams_lte.pcch_defaultPagingCycle); + break; + } - case 2: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm2; - break; + if (strcmp(ccparams_lte.pcch_nB, "fourT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_fourT; + } else if (strcmp(ccparams_lte.pcch_nB, "twoT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_twoT; + } else if (strcmp(ccparams_lte.pcch_nB, "oneT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneT; + } else if (strcmp(ccparams_lte.pcch_nB, "halfT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_halfT; + } else if (strcmp(ccparams_lte.pcch_nB, "quarterT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_quarterT; + } else if (strcmp(ccparams_lte.pcch_nB, "oneEighthT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneEighthT; + } else if (strcmp(ccparams_lte.pcch_nB, "oneSixteenthT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneSixteenthT; + } else if (strcmp(ccparams_lte.pcch_nB, "oneThirtySecondT") == 0) { + RRCcfg->radioresourceconfig[j].pcch_nB = LTE_PCCH_Config__nB_oneThirtySecondT; + } else { + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", + RC.config_file_name, + i, + ccparams_lte.pcch_nB); + } - case 3: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm3; - break; + if (strcmp(ccparams_lte.drx_Config_present, "prNothing") == 0) { + RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_NOTHING; + } else if (strcmp(ccparams_lte.drx_Config_present, "prRelease") == 0) { + RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_release; + } else if (strcmp(ccparams_lte.drx_Config_present, "prSetup") == 0) { + RRCcfg->radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_setup; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_Config_present choice: prNothing, prRelease, prSetup!\n", + RC.config_file_name, i, ccparams_lte.drx_Config_present); + } - case 4: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm4; - break; + if (strcmp(ccparams_lte.drx_onDurationTimer, "psf1") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf1; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf2") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf2; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf3") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf3; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf4") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf4; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf5") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf5; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf6") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf6; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf8") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf8; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf10") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf10; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf20") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf20; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf30") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf30; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf40") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf40; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf50") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf50; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf60") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf60; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf80") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf80; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf100") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf100; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf200") == 0) { + RRCcfg->radioresourceconfig[j].drx_onDurationTimer = (long)LTE_DRX_Config__setup__onDurationTimer_psf200; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_onDurationTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_onDurationTimer); + break; + } - case 5: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm5; - break; + if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf2; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf3") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf3; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf4") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf4; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf5") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf5; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf6") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf6; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf8") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf8; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf10") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf10; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf20") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf20; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf30") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf30; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf40") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf40; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf50") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf50; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf60") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf60; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf80") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf80; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf100") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf100; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf200") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf200; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf300") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf300; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf500") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf500; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf750") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf750; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1280") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1280; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1920") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf1920; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2560") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf2560; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf0-v1020") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_psf0_v1020; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare9") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare9; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare8") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare8; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare7") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare7; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare6") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare6; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare5") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare5; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare4") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare4; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare3") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare3; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare2") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare2; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare1") == 0) { + RRCcfg->radioresourceconfig[j].drx_InactivityTimer = (long)LTE_DRX_Config__setup__drx_InactivityTimer_spare1; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_InactivityTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_InactivityTimer); + break; + } - case 6: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm6; - break; + RRCcfg->radioresourceconfig[j].ue_multiple_max = ccparams_lte.ue_multiple_max; - case 7: - RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm7; - break; + if (!ccparams_lte.mbms_dedicated_serving_cell) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u define %s: TRUE,FALSE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL); + else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "ENABLE") == 0) { + RRCcfg->radioresourceconfig[j].mbms_dedicated_serving_cell = true; + } else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "DISABLE") == 0) { + RRCcfg->radioresourceconfig[j].mbms_dedicated_serving_cell = false; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for mbms_dedicated_serving_cell choice: TRUE or FALSE !\n", + RC.config_file_name, i, ccparams_lte.mbms_dedicated_serving_cell); + } - default: + switch (ccparams_lte.N_RB_DL) { + case 25: + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 4)) AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7", - RC.config_file_name, i, ccparams_lte.ue_TransmissionMode); - break; - } - - RRCcfg->radioresourceconfig[j].ue_multiple_max = ccparams_lte.ue_multiple_max; + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..4!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); - switch (ccparams_lte.N_RB_DL) { - case 25: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 4)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..4!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + break; - break; + case 50: + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 8)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..8!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); - case 50: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 8)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..8!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + break; - break; + case 100: + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 16)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..16!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); - case 100: - if ((ccparams_lte.ue_multiple_max < 1) || - (ccparams_lte.ue_multiple_max > 16)) - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..16!\n", - RC.config_file_name, i, ccparams_lte.ue_multiple_max); + break; - break; + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n", + RC.config_file_name, i, ccparams_lte.N_RB_DL); + break; + } - default: - AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n", - RC.config_file_name, i, ccparams_lte.N_RB_DL); - break; + if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf1") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf1; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf2") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf2; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf4") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf4; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf6") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf6; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf8") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf8; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf16") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf16; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf24") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf24; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf33") == 0) { + RRCcfg->radioresourceconfig[j].drx_RetransmissionTimer = (long)LTE_DRX_Config__setup__drx_RetransmissionTimer_psf33; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for drx_RetransmissionTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_RetransmissionTimer); + break; + } + + if (ccparams_lte.drx_longDrx_CycleStartOffset_present == NULL || strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prNothing") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_NOTHING; + } else { + if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf10") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10; + offsetMaxLimit = 10; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf20") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20; + offsetMaxLimit = 20; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf32") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32; + offsetMaxLimit = 32; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf40") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40; + offsetMaxLimit = 40; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf64") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64; + offsetMaxLimit = 64; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf80") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80; + offsetMaxLimit = 80; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf128") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128; + offsetMaxLimit = 128; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf160") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160; + offsetMaxLimit = 160; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf256") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256; + offsetMaxLimit = 256; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf320") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320; + offsetMaxLimit = 320; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf512") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512; + offsetMaxLimit = 512; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf640") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640; + offsetMaxLimit = 640; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1024") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024; + offsetMaxLimit = 1024; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1280") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280; + offsetMaxLimit = 1280; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2048") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048; + offsetMaxLimit = 2048; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2560") == 0) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560; + offsetMaxLimit = 2560; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file \"%s\", enb %u unknown string value \"%s\" for drx_longDrx_CycleStartOffset_present choice !\n", + RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset_present); } - // eMBMS configuration - RRCcfg->eMBMS_configured = 0; - printf("No eMBMS configuration, skipping it\n"); - // eMTC configuration - char brparamspath[MAX_OPTNAME_SIZE*2 + 160]; - sprintf(brparamspath,"%s.%s", ccspath, ENB_CONFIG_STRING_EMTC_PARAMETERS); - config_get(eMTCParams, sizeof(eMTCParams)/sizeof(paramdef_t), brparamspath); - RRCcfg->eMTC_configured = eMTCconfig.eMTC_configured & 1; - - if (eMTCconfig.eMTC_configured > 0) - fill_eMTC_configuration(RRCcfg, &eMTCconfig, i, j, RC.config_file_name, brparamspath); - else printf("No eMTC configuration, skipping it\n"); - - // Sidelink configuration - char SLparamspath[MAX_OPTNAME_SIZE*2 + 160]; - sprintf(SLparamspath,"%s.%s", ccspath, ENB_CONFIG_STRING_SL_PARAMETERS); - config_get( SLParams, sizeof(SLParams)/sizeof(paramdef_t), SLparamspath); - // Sidelink Resource pool information - RRCcfg->SL_configured = SLconfig.sidelink_configured & 1; - - if (SLconfig.sidelink_configured == 1) - fill_SL_configuration(RRCcfg, &SLconfig, i, j, RC.config_file_name); - else printf("No SL configuration skipping it\n"); - } // !NODE_IS_DU(node_type) - } + if (ccparams_lte.drx_longDrx_CycleStartOffset >= 0 && ccparams_lte.drx_longDrx_CycleStartOffset < offsetMaxLimit) { + RRCcfg->radioresourceconfig[j].drx_longDrx_CycleStartOffset = ccparams_lte.drx_longDrx_CycleStartOffset; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u incoherent value \"%d\" for drx_longDrx_CycleStartOffset !\n", + RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset); + } + } - RRCcfg->nr_scg_ssb_freq = ccparams_lte.nr_scg_ssb_freq; + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") == 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer == 0) { + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") != 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer != 0) { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u incoherent values \"%s\" - \"%d\" for drx_shortDrx_Cycle or drx_shortDrx_ShortCycleTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle, ccparams_lte.drx_shortDrx_ShortCycleTimer); + } else { + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = -1; + RRCcfg->radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = 0; + } + } else { + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf2") == 0) { + cycleNb = 2; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf2; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf5") == 0) { + cycleNb = 5; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf5; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf8") == 0) { + cycleNb = 8; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf8; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf10") == 0) { + cycleNb = 10; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf10; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf16") == 0) { + cycleNb = 16; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf16; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf20") == 0) { + cycleNb = 20; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf20; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf32") == 0) { + cycleNb = 32; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf32; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf40") == 0) { + cycleNb = 40; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf40; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf64") == 0) { + cycleNb = 64; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf64; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf80") == 0) { + cycleNb = 80; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf80; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf128") == 0) { + cycleNb = 128; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf128; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf160") == 0) { + cycleNb = 160; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf160; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf256") == 0) { + cycleNb = 256; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf256; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf320") == 0) { + cycleNb = 320; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf320; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf512") == 0) { + cycleNb = 512; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf512; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf640") == 0) { + cycleNb = 640; + RRCcfg->radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf640; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u incoherent value \"%s\" for drx_shortDrx_Cycle !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle); + } - if (!NODE_IS_DU(rrc->node_type)) { - char srb1path[MAX_OPTNAME_SIZE*2 + 8]; - sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1); - config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path); + if (cycleNb > 0 && (offsetMaxLimit % cycleNb != 0 || cycleNb == offsetMaxLimit)) { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u incompatible (not multiple) values \"%d\" - \"%d\" for drx_shortDrx_Cycle and drx_longDrx_CycleStartOffset choice !\n", + RC.config_file_name, i, cycleNb, offsetMaxLimit); + } - switch (srb1_params.srb1_max_retx_threshold) { - case 1: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t1; - break; + if (ccparams_lte.drx_shortDrx_ShortCycleTimer >= 1 && ccparams_lte.drx_shortDrx_ShortCycleTimer <= 16 ) { + RRCcfg->radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = ccparams_lte.drx_shortDrx_ShortCycleTimer; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for drx_shortDrx_ShortCycleTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_ShortCycleTimer ); + } + } + switch (ccparams_lte.bcch_modificationPeriodCoeff) { case 2: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t2; - break; - - case 3: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t3; + RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n2; break; case 4: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t4; - break; - - case 6: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t6; + RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n4; break; case 8: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t8; + RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n8; break; case 16: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t16; - break; - - case 32: - rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t32; + RRCcfg->radioresourceconfig[j].bcch_modificationPeriodCoeff = LTE_BCCH_Config__modificationPeriodCoeff_n16; break; default: AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_max_retx_threshold %d!\n", - RC.config_file_name, i, srb1_params.srb1_max_retx_threshold); + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", + RC.config_file_name, i, ccparams_lte.bcch_modificationPeriodCoeff); + break; } - switch (srb1_params.srb1_poll_pdu) { - case 4: - rrc->srb1_poll_pdu = LTE_PollPDU_p4; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t300 = ccparams_lte.ue_TimersAndConstants_t300; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t301 = ccparams_lte.ue_TimersAndConstants_t301; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t310 = ccparams_lte.ue_TimersAndConstants_t310; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_t311 = ccparams_lte.ue_TimersAndConstants_t311; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_n310 = ccparams_lte.ue_TimersAndConstants_n310; + RRCcfg->radioresourceconfig[j].ue_TimersAndConstants_n311 = ccparams_lte.ue_TimersAndConstants_n311; + + switch (ccparams_lte.ue_TransmissionMode) { + case 1: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm1; break; - case 8: - rrc->srb1_poll_pdu = LTE_PollPDU_p8; + case 2: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm2; break; - case 16: - rrc->srb1_poll_pdu = LTE_PollPDU_p16; + case 3: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm3; break; - case 32: - rrc->srb1_poll_pdu = LTE_PollPDU_p32; + case 4: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm4; break; - case 64: - rrc->srb1_poll_pdu = LTE_PollPDU_p64; + case 5: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm5; break; - case 128: - rrc->srb1_poll_pdu = LTE_PollPDU_p128; + case 6: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm6; break; - case 256: - rrc->srb1_poll_pdu = LTE_PollPDU_p256; + case 7: + RRCcfg->radioresourceconfig[j].ue_TransmissionMode = LTE_AntennaInfoDedicated__transmissionMode_tm7; break; default: - if (srb1_params.srb1_poll_pdu >= 10000) - rrc->srb1_poll_pdu = LTE_PollPDU_pInfinity; - else - AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_poll_pdu %d!\n", - RC.config_file_name, i, srb1_params.srb1_poll_pdu); + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7", + RC.config_file_name, i, ccparams_lte.ue_TransmissionMode); + break; } - rrc->srb1_poll_byte = srb1_params.srb1_poll_byte; + RRCcfg->radioresourceconfig[j].ue_multiple_max = ccparams_lte.ue_multiple_max; - switch (srb1_params.srb1_poll_byte) { + switch (ccparams_lte.N_RB_DL) { case 25: - rrc->srb1_poll_byte = LTE_PollByte_kB25; + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 4)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..4!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); + break; case 50: - rrc->srb1_poll_byte = LTE_PollByte_kB50; - break; + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 8)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..8!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); - case 75: - rrc->srb1_poll_byte = LTE_PollByte_kB75; break; case 100: - rrc->srb1_poll_byte = LTE_PollByte_kB100; - break; + if ((ccparams_lte.ue_multiple_max < 1) || + (ccparams_lte.ue_multiple_max > 16)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for ue_multiple_max choice: 1..16!\n", + RC.config_file_name, i, ccparams_lte.ue_multiple_max); - case 125: - rrc->srb1_poll_byte = LTE_PollByte_kB125; break; - case 250: - rrc->srb1_poll_byte = LTE_PollByte_kB250; + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %u unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n", + RC.config_file_name, i, ccparams_lte.N_RB_DL); break; + } - case 375: - rrc->srb1_poll_byte = LTE_PollByte_kB375; - break; + // eMBMS configuration + RRCcfg->eMBMS_configured = 0; + printf("No eMBMS configuration, skipping it\n"); + // eMTC configuration + char brparamspath[MAX_OPTNAME_SIZE*2 + 160]; + sprintf(brparamspath,"%s.%s", ccspath, ENB_CONFIG_STRING_EMTC_PARAMETERS); + config_get(eMTCParams, sizeof(eMTCParams)/sizeof(paramdef_t), brparamspath); + RRCcfg->eMTC_configured = eMTCconfig.eMTC_configured & 1; + + if (eMTCconfig.eMTC_configured > 0) + fill_eMTC_configuration(RRCcfg, &eMTCconfig, i, j, RC.config_file_name, brparamspath); + else printf("No eMTC configuration, skipping it\n"); + + // Sidelink configuration + char SLparamspath[MAX_OPTNAME_SIZE*2 + 160]; + sprintf(SLparamspath,"%s.%s", ccspath, ENB_CONFIG_STRING_SL_PARAMETERS); + config_get( SLParams, sizeof(SLParams)/sizeof(paramdef_t), SLparamspath); + // Sidelink Resource pool information + RRCcfg->SL_configured = SLconfig.sidelink_configured & 1; + + if (SLconfig.sidelink_configured == 1) + fill_SL_configuration(RRCcfg, &SLconfig, i, j, RC.config_file_name); + else printf("No SL configuration skipping it\n"); + } - case 500: - rrc->srb1_poll_byte = LTE_PollByte_kB500; - break; + RRCcfg->nr_scg_ssb_freq = ccparams_lte.nr_scg_ssb_freq; - case 750: - rrc->srb1_poll_byte = LTE_PollByte_kB750; - break; + char srb1path[MAX_OPTNAME_SIZE*2 + 8]; + sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1); + config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path); - case 1000: - rrc->srb1_poll_byte = LTE_PollByte_kB1000; - break; + switch (srb1_params.srb1_max_retx_threshold) { + case 1: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t1; + break; - case 1250: - rrc->srb1_poll_byte = LTE_PollByte_kB1250; - break; + case 2: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t2; + break; - case 1500: - rrc->srb1_poll_byte = LTE_PollByte_kB1500; - break; + case 3: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t3; + break; - case 2000: - rrc->srb1_poll_byte = LTE_PollByte_kB2000; - break; + case 4: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t4; + break; - case 3000: - rrc->srb1_poll_byte = LTE_PollByte_kB3000; - break; + case 6: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t6; + break; - default: - if (srb1_params.srb1_poll_byte >= 10000) - rrc->srb1_poll_byte = LTE_PollByte_kBinfinity; - else - AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_poll_byte %d!\n", - RC.config_file_name, i, srb1_params.srb1_poll_byte); - } + case 8: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t8; + break; - if (srb1_params.srb1_timer_poll_retransmit <= 250) { - rrc->srb1_timer_poll_retransmit = (srb1_params.srb1_timer_poll_retransmit - 5)/5; - } else if (srb1_params.srb1_timer_poll_retransmit <= 500) { - rrc->srb1_timer_poll_retransmit = (srb1_params.srb1_timer_poll_retransmit - 300)/50 + 50; - } else { - AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_poll_retransmit %d!\n", - RC.config_file_name, i, srb1_params.srb1_timer_poll_retransmit); - } + case 16: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t16; + break; - if (srb1_params.srb1_timer_status_prohibit <= 250) { - rrc->srb1_timer_status_prohibit = srb1_params.srb1_timer_status_prohibit/5; - } else if ((srb1_params.srb1_timer_poll_retransmit >= 300) && (srb1_params.srb1_timer_poll_retransmit <= 500)) { - rrc->srb1_timer_status_prohibit = (srb1_params.srb1_timer_status_prohibit - 300)/50 + 51; - } else { + case 32: + rrc->srb1_max_retx_threshold = LTE_UL_AM_RLC__maxRetxThreshold_t32; + break; + + default: AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_status_prohibit %d!\n", - RC.config_file_name, i, srb1_params.srb1_timer_status_prohibit); - } + "Bad config value when parsing eNB configuration file %s, enb %u srb1_max_retx_threshold %d!\n", + RC.config_file_name, i, srb1_params.srb1_max_retx_threshold); + } - switch (srb1_params.srb1_timer_reordering) { - case 0: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms0; - break; + switch (srb1_params.srb1_poll_pdu) { + case 4: + rrc->srb1_poll_pdu = LTE_PollPDU_p4; + break; - case 5: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms5; - break; + case 8: + rrc->srb1_poll_pdu = LTE_PollPDU_p8; + break; - case 10: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms10; - break; + case 16: + rrc->srb1_poll_pdu = LTE_PollPDU_p16; + break; - case 15: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms15; - break; + case 32: + rrc->srb1_poll_pdu = LTE_PollPDU_p32; + break; - case 20: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms20; - break; + case 64: + rrc->srb1_poll_pdu = LTE_PollPDU_p64; + break; - case 25: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms25; - break; + case 128: + rrc->srb1_poll_pdu = LTE_PollPDU_p128; + break; - case 30: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms30; - break; + case 256: + rrc->srb1_poll_pdu = LTE_PollPDU_p256; + break; - case 35: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms35; - break; + default: + if (srb1_params.srb1_poll_pdu >= 10000) + rrc->srb1_poll_pdu = LTE_PollPDU_pInfinity; + else + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %u srb1_poll_pdu %d!\n", + RC.config_file_name, i, srb1_params.srb1_poll_pdu); + } - case 40: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms40; - break; + rrc->srb1_poll_byte = srb1_params.srb1_poll_byte; - case 45: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms45; - break; + switch (srb1_params.srb1_poll_byte) { + case 25: + rrc->srb1_poll_byte = LTE_PollByte_kB25; + break; - case 50: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms50; - break; + case 50: + rrc->srb1_poll_byte = LTE_PollByte_kB50; + break; - case 55: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms55; - break; + case 75: + rrc->srb1_poll_byte = LTE_PollByte_kB75; + break; - case 60: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms60; - break; + case 100: + rrc->srb1_poll_byte = LTE_PollByte_kB100; + break; - case 65: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms65; - break; + case 125: + rrc->srb1_poll_byte = LTE_PollByte_kB125; + break; - case 70: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms70; - break; + case 250: + rrc->srb1_poll_byte = LTE_PollByte_kB250; + break; - case 75: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms75; - break; + case 375: + rrc->srb1_poll_byte = LTE_PollByte_kB375; + break; - case 80: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms80; - break; + case 500: + rrc->srb1_poll_byte = LTE_PollByte_kB500; + break; - case 85: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms85; - break; + case 750: + rrc->srb1_poll_byte = LTE_PollByte_kB750; + break; - case 90: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms90; - break; + case 1000: + rrc->srb1_poll_byte = LTE_PollByte_kB1000; + break; - case 95: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms95; - break; + case 1250: + rrc->srb1_poll_byte = LTE_PollByte_kB1250; + break; - case 100: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms100; - break; + case 1500: + rrc->srb1_poll_byte = LTE_PollByte_kB1500; + break; - case 110: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms110; - break; + case 2000: + rrc->srb1_poll_byte = LTE_PollByte_kB2000; + break; - case 120: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms120; - break; + case 3000: + rrc->srb1_poll_byte = LTE_PollByte_kB3000; + break; - case 130: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms130; - break; + default: + if (srb1_params.srb1_poll_byte >= 10000) + rrc->srb1_poll_byte = LTE_PollByte_kBinfinity; + else + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %u srb1_poll_byte %d!\n", + RC.config_file_name, i, srb1_params.srb1_poll_byte); + } - case 140: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms140; - break; + if (srb1_params.srb1_timer_poll_retransmit <= 250) { + rrc->srb1_timer_poll_retransmit = (srb1_params.srb1_timer_poll_retransmit - 5)/5; + } else if (srb1_params.srb1_timer_poll_retransmit <= 500) { + rrc->srb1_timer_poll_retransmit = (srb1_params.srb1_timer_poll_retransmit - 300)/50 + 50; + } else { + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_poll_retransmit %d!\n", + RC.config_file_name, i, srb1_params.srb1_timer_poll_retransmit); + } - case 150: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms150; - break; + if (srb1_params.srb1_timer_status_prohibit <= 250) { + rrc->srb1_timer_status_prohibit = srb1_params.srb1_timer_status_prohibit/5; + } else if ((srb1_params.srb1_timer_poll_retransmit >= 300) && (srb1_params.srb1_timer_poll_retransmit <= 500)) { + rrc->srb1_timer_status_prohibit = (srb1_params.srb1_timer_status_prohibit - 300)/50 + 51; + } else { + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_status_prohibit %d!\n", + RC.config_file_name, i, srb1_params.srb1_timer_status_prohibit); + } - case 160: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms160; - break; + switch (srb1_params.srb1_timer_reordering) { + case 0: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms0; + break; - case 170: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms170; - break; + case 5: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms5; + break; - case 180: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms180; - break; + case 10: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms10; + break; - case 190: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms190; - break; + case 15: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms15; + break; - case 200: - rrc->srb1_timer_reordering = LTE_T_Reordering_ms200; - break; + case 20: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms20; + break; - default: - AssertFatal (0, - "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_reordering %d!\n", - RC.config_file_name, i, srb1_params.srb1_timer_reordering); - } - } - } - } - } - } + case 25: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms25; + break; - LOG_I(RRC,"Node type %d \n ", rrc->node_type); - return 0; -} + case 30: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms30; + break; -int RCconfig_DU_F1(MessageDef *msg_p, uint32_t i) { - int k; - paramdef_t ENBSParams[] = ENBSPARAMS_DESC; - paramdef_t ENBParams[] = ENBPARAMS_DESC; - paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0}; - config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); - int num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; - AssertFatal (i<num_enbs, - "Failed to parse config file no %uth element in %s \n",i, ENB_CONFIG_STRING_ACTIVE_ENBS); + case 35: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms35; + break; - if (num_enbs>0) { - // Output a list of all eNBs. - config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); - AssertFatal(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr != NULL, - "eNB id %u is not defined in configuration file\n",i); - F1AP_SETUP_REQ (msg_p).num_cells_available = 0; - F1AP_SETUP_REQ (msg_p).cell_type = CELL_MACRO_ENB; + case 40: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms40; + break; - for (k=0; k <num_enbs ; k++) { - if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) { - char aprefix[MAX_OPTNAME_SIZE*2 + 8]; - sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k); - paramdef_t PLMNParams[] = PLMNPARAMS_DESC; - paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0}; - /* map parameter checking array instances to parameter definition array instances */ - checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK; + case 45: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms45; + break; - for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I) - PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]); + case 50: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms50; + break; - config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), aprefix); - paramdef_t SCTPParams[] = SCTPPARAMS_DESC; - F1AP_SETUP_REQ (msg_p).num_cells_available++; - F1AP_SETUP_REQ (msg_p).gNB_DU_id = *(ENBParamList.paramarray[0][ENB_ENB_ID_IDX].uptr); - LOG_I(ENB_APP,"F1AP: gNB_DU_id[%d] %ld\n",k,F1AP_SETUP_REQ (msg_p).gNB_DU_id); - F1AP_SETUP_REQ (msg_p).gNB_DU_name = strdup(*(ENBParamList.paramarray[0][ENB_ENB_NAME_IDX].strptr)); - LOG_I(ENB_APP,"F1AP: gNB_DU_name[%d] %s\n",k,F1AP_SETUP_REQ (msg_p).gNB_DU_name); - F1AP_SETUP_REQ (msg_p).cell[k].tac = *ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].uptr; - LOG_I(ENB_APP,"F1AP: tac[%d] %d\n",k,F1AP_SETUP_REQ (msg_p).cell[k].tac); - F1AP_SETUP_REQ (msg_p).cell[k].mcc = *PLMNParamList.paramarray[0][ENB_MOBILE_COUNTRY_CODE_IDX].uptr; - LOG_I(ENB_APP,"F1AP: mcc[%d] %d\n",k,F1AP_SETUP_REQ (msg_p).cell[k].mcc); - F1AP_SETUP_REQ (msg_p).cell[k].mnc = *PLMNParamList.paramarray[0][ENB_MOBILE_NETWORK_CODE_IDX].uptr; - LOG_I(ENB_APP,"F1AP: mnc[%d] %d\n",k,F1AP_SETUP_REQ (msg_p).cell[k].mnc); - F1AP_SETUP_REQ (msg_p).cell[k].mnc_digit_length = *PLMNParamList.paramarray[0][ENB_MNC_DIGIT_LENGTH].u8ptr; - LOG_I(ENB_APP,"F1AP: mnc_digit_length[%d] %d\n",k,F1AP_SETUP_REQ (msg_p).cell[k].mnc_digit_length); - AssertFatal((F1AP_SETUP_REQ (msg_p).cell[k].mnc_digit_length == 2) || - (F1AP_SETUP_REQ (msg_p).cell[k].mnc_digit_length == 3), - "BAD MNC DIGIT LENGTH %d", - F1AP_SETUP_REQ (msg_p).cell[k].mnc_digit_length); - F1AP_SETUP_REQ (msg_p).cell[k].nr_cellid = (uint64_t)*(ENBParamList.paramarray[i][ENB_NRCELLID_IDX].u64ptr); - LOG_I(ENB_APP,"F1AP: nr_cellid[%d] %ld\n",k,F1AP_SETUP_REQ (msg_p).cell[k].nr_cellid); - LOG_I(ENB_APP,"F1AP: CU_ip4_address in DU %s\n",RC.mac[k]->eth_params_n.remote_addr); - LOG_I(ENB_APP,"FIAP: CU_ip4_address in DU %p, strlen %d\n",F1AP_SETUP_REQ (msg_p).CU_f1_ip_address.ipv4_address,(int)strlen(RC.mac[k]->eth_params_n.remote_addr)); - F1AP_SETUP_REQ (msg_p).CU_f1_ip_address.ipv6 = 0; - F1AP_SETUP_REQ (msg_p).CU_f1_ip_address.ipv4 = 1; - //strcpy(F1AP_SETUP_REQ (msg_p).CU_f1_ip_address.ipv6_address, ""); - strcpy(F1AP_SETUP_REQ (msg_p).CU_f1_ip_address.ipv4_address, RC.mac[k]->eth_params_n.remote_addr); - LOG_I(ENB_APP,"F1AP: DU_ip4_address in DU %s\n",RC.mac[k]->eth_params_n.my_addr); - LOG_I(ENB_APP,"FIAP: DU_ip4_address in DU %p, strlen %d\n",F1AP_SETUP_REQ (msg_p).DU_f1_ip_address.ipv4_address,(int)strlen(RC.mac[k]->eth_params_n.my_addr)); - F1AP_SETUP_REQ (msg_p).DU_f1_ip_address.ipv6 = 0; - F1AP_SETUP_REQ (msg_p).DU_f1_ip_address.ipv4 = 1; - - //strcpy(F1AP_SETUP_REQ (msg_p).DU_f1_ip_address.ipv6_address, ""); - strcpy(F1AP_SETUP_REQ (msg_p).DU_f1_ip_address.ipv4_address, RC.mac[k]->eth_params_n.my_addr); - F1AP_SETUP_REQ (msg_p).DUport= RC.mac[k]->eth_params_n.my_portd; - F1AP_SETUP_REQ (msg_p).CUport= RC.mac[k]->eth_params_n.remote_portd; - //strcpy(F1AP_SETUP_REQ (msg_p).CU_ip_address[l].ipv6_address,*(F1ParamList.paramarray[l][ENB_CU_IPV6_ADDRESS_IDX].strptr)); - //F1AP_SETUP_REQ (msg_p).CU_port = RC.mac[k]->eth_params_n.remote_portc; // maybe we dont need it - sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG); - config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); - F1AP_SETUP_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); - F1AP_SETUP_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); - eNB_RRC_INST *rrc = RC.rrc[k]; - // wait until RRC cell information is configured - int cell_info_configured=0; - - do { - LOG_I(ENB_APP,"ngran_eNB_DU: Waiting for basic cell configuration\n"); - usleep(100000); - pthread_mutex_lock(&rrc->cell_info_mutex); - cell_info_configured = rrc->cell_info_configured; - pthread_mutex_unlock(&rrc->cell_info_mutex); - } while (cell_info_configured ==0); - - rrc->configuration.mcc[0] = F1AP_SETUP_REQ (msg_p).cell[k].mcc; - rrc->configuration.mnc[0] = F1AP_SETUP_REQ (msg_p).cell[k].mnc; - rrc->configuration.tac = F1AP_SETUP_REQ (msg_p).cell[k].tac; - rrc->nr_cellid = F1AP_SETUP_REQ (msg_p).cell[k].nr_cellid; - F1AP_SETUP_REQ (msg_p).cell[k].nr_pci = rrc->carrier[0].physCellId; - F1AP_SETUP_REQ (msg_p).cell[k].num_ssi = 0; - - if (rrc->carrier[0].sib1->tdd_Config) { - LOG_I(ENB_APP,"ngran_DU: Configuring Cell %d for TDD\n",k); - F1AP_SETUP_REQ (msg_p).fdd_flag = 0; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.nr_arfcn = freq_to_arfcn10(rrc->carrier[0].sib1->freqBandIndicator, - rrc->carrier[0].dl_CarrierFreq); - // For LTE use scs field to carry prefix type and number of antennas - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.scs = (rrc->carrier[0].Ncp<<2)+rrc->carrier[0].p_eNB;; - // use nrb field to hold LTE N_RB_DL (0...5) - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.nrb = rrc->carrier[0].mib.message.dl_Bandwidth; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.nrb = rrc->carrier[0].mib.message.dl_Bandwidth; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.num_frequency_bands = 1; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.nr_band[0] = rrc->carrier[0].sib1->freqBandIndicator; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].tdd.sul_active = 0; - } else { - LOG_I(ENB_APP,"ngran_DU: Configuring Cell %d for FDD\n",k); - F1AP_SETUP_REQ (msg_p).fdd_flag = 1; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_nr_arfcn = freq_to_arfcn10(rrc->carrier[0].sib1->freqBandIndicator, - rrc->carrier[0].dl_CarrierFreq); - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_nr_arfcn = F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_nr_arfcn; - // For LTE use scs field to carry prefix type and number of antennas - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_scs = (rrc->carrier[0].Ncp<<2)+rrc->carrier[0].p_eNB;; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_scs = rrc->carrier[0].Ncp; - // use nrb field to hold LTE N_RB_DL (0...5) - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_nrb = rrc->carrier[0].mib.message.dl_Bandwidth; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_nrb = rrc->carrier[0].mib.message.dl_Bandwidth; - // RK: we need to check there value for FDD's frequency_bands DL/UL - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_num_frequency_bands = 1; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_nr_band[0] = rrc->carrier[0].sib1->freqBandIndicator; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_num_frequency_bands = 1; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_nr_band[0] = rrc->carrier[0].sib1->freqBandIndicator; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_num_sul_frequency_bands = 0; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.ul_nr_sul_band[0] = rrc->carrier[0].sib1->freqBandIndicator; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_num_sul_frequency_bands = 0; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.dl_nr_sul_band[0] = rrc->carrier[0].sib1->freqBandIndicator; - F1AP_SETUP_REQ (msg_p).nr_mode_info[k].fdd.sul_active = 0; - } + case 55: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms55; + break; - F1AP_SETUP_REQ (msg_p).measurement_timing_information[k] = "0"; - F1AP_SETUP_REQ (msg_p).ranac[k] = 0; - F1AP_SETUP_REQ (msg_p).mib[k] = rrc->carrier[0].MIB; - F1AP_SETUP_REQ (msg_p).sib1[k] = rrc->carrier[0].SIB1; - F1AP_SETUP_REQ (msg_p).mib_length[k] = rrc->carrier[0].sizeof_MIB; - F1AP_SETUP_REQ (msg_p).sib1_length[k] = rrc->carrier[0].sizeof_SIB1; - break; - } // if - } // for - } // if + case 60: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms60; + break; + + case 65: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms65; + break; + + case 70: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms70; + break; + + case 75: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms75; + break; + + case 80: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms80; + break; + + case 85: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms85; + break; + + case 90: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms90; + break; + + case 95: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms95; + break; + + case 100: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms100; + break; + + case 110: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms110; + break; + + case 120: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms120; + break; + + case 130: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms130; + break; + + case 140: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms140; + break; + + case 150: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms150; + break; + + case 160: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms160; + break; + + case 170: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms170; + break; + + case 180: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms180; + break; + + case 190: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms190; + break; + + case 200: + rrc->srb1_timer_reordering = LTE_T_Reordering_ms200; + break; + + default: + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %u srb1_timer_reordering %d!\n", + RC.config_file_name, i, srb1_params.srb1_timer_reordering); + } + } + } + } + } return 0; } @@ -2975,80 +2786,80 @@ void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_cont carrier->SIB23 = (uint8_t *)malloc(64); memcpy((void *)carrier->SIB23,(void *)si_container,si_container_length); carrier->sizeof_SIB23 = si_container_length; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB2 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB2\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3: carrier->sib3 = &typeandinfo->choice.sib3; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB3 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB3\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4: //carrier->sib4 = &typeandinfo->choice.sib4; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5: //carrier->sib5 = &typeandinfo->choice.sib5; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6: //carrier->sib6 = &typeandinfo->choice.sib6; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB6 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB6\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7: //carrier->sib7 = &typeandinfo->choice.sib7; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB7 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB7\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8: //carrier->sib8 = &typeandinfo->choice.sib8; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB8 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB8\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9: //carrier->sib9 = &typeandinfo->choice.sib9; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB9 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB9\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10: //carrier->sib10 = &typeandinfo->choice.sib10; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB10 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB10\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11: //carrier->sib11 = &typeandinfo->choice.sib11; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB11 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB11\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920: //carrier->sib12 = &typeandinfo->choice.sib12; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB12 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB12\n", inst); break; case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920: carrier->sib13 = &typeandinfo->choice.sib13_v920; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB13 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB13\n", inst); break; //SIB18 case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250: carrier->sib18 = &typeandinfo->choice.sib18_v1250; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB18 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB18\n", inst); break; //SIB19 case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250: carrier->sib19 = &typeandinfo->choice.sib19_v1250; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB19 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB19\n", inst); break; //SIB21 case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430: carrier->sib21 = &typeandinfo->choice.sib21_v1430; - LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB21 in CU F1AP_SETUP_RESP message\n", inst); + LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB21\n", inst); break; default: @@ -3092,49 +2903,7 @@ void configure_du_mac(int inst) { rrc_mac_config_req_eNB(inst, &tmp); } -void handle_f1ap_setup_resp(f1ap_setup_resp_t *resp) { - int i,j,si_ind; - LOG_I(ENB_APP, "cells_to_activated %d, RRC instances %d\n", - resp->num_cells_to_activate,RC.nb_inst); - - for (j=0; j<resp->num_cells_to_activate; j++) { - for (i=0; i<RC.nb_inst; i++) { - rrc_eNB_carrier_data_t *carrier = &RC.rrc[i]->carrier[0]; - // identify local index of cell j by nr_cellid, plmn identity and physical cell ID - LOG_I(ENB_APP, "Checking cell %d, rrc inst %d : rrc->nr_cellid %lx, resp->nr_cellid %lx\n", - j,i,RC.rrc[i]->nr_cellid,resp->cells_to_activate[j].nr_cellid); - - if (RC.rrc[i]->nr_cellid == resp->cells_to_activate[j].nr_cellid && - (check_plmn_identity(carrier, resp->cells_to_activate[j].mcc, resp->cells_to_activate[j].mnc, resp->cells_to_activate[j].mnc_digit_length)>0 && - resp->cells_to_activate[j].nrpci == carrier->physCellId)) { - // copy system information and decode it - for (si_ind=0; si_ind<resp->cells_to_activate[j].num_SI; si_ind++) { - //printf("SI %d size %d: ", si_ind, resp->cells_to_activate[j].SI_container_length[si_ind]); - //for (int n=0;n<resp->cells_to_activate[j].SI_container_length[si_ind];n++) - // printf("%02x ",resp->cells_to_activate[j].SI_container[si_ind][n]); - //printf("\n"); - if (si_ind==6) si_ind=9; - if (resp->cells_to_activate[j].SI_container[si_ind] != NULL) { - extract_and_decode_SI(i, - resp->cells_to_activate[j].SI_type[si_ind], - resp->cells_to_activate[j].SI_container[si_ind], - resp->cells_to_activate[j].SI_container_length[si_ind]); - } - - } - - // perform MAC/L1 common configuration - configure_du_mac(i); - } else { - LOG_E(ENB_APP, "F1 Setup Response not matching\n"); - } - } - } -} - void read_config_and_init(void) { - int macrlc_has_f1[MAX_MAC_INST]; - memset(macrlc_has_f1, 0, MAX_MAC_INST*sizeof(int)); if (RC.nb_macrlc_inst > 0) AssertFatal(RC.nb_macrlc_inst == RC.nb_inst, @@ -3143,7 +2912,7 @@ void read_config_and_init(void) { RCconfig_L1(); LOG_I(PHY, "%s() RC.nb_L1_inst: %d\n", __FUNCTION__, RC.nb_L1_inst); - RCconfig_macrlc(macrlc_has_f1); + RCconfig_macrlc(); LOG_I(MAC, "%s() RC.nb_macrlc_inst: %d\n", __FUNCTION__, RC.nb_macrlc_inst); if (RC.nb_L1_inst > 0) @@ -3156,6 +2925,6 @@ void read_config_and_init(void) { RC.rrc[enb_id] = malloc(sizeof(eNB_RRC_INST)); AssertFatal(RC.rrc[enb_id], "RRC context for eNB %u not allocated\n", enb_id); memset((void *)RC.rrc[enb_id], 0, sizeof(eNB_RRC_INST)); - RCconfig_RRC(enb_id, RC.rrc[enb_id],macrlc_has_f1[enb_id]); + RCconfig_RRC(enb_id, RC.rrc[enb_id]); } } diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 904ace1b73f78b3f1b1792803afb09c5451bd43d..67b4fb45e70258b39230e8c77b7c01e5a8bdfae7 100644 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -101,7 +101,7 @@ typedef struct ru_config_s { } ru_config_t; extern void RCconfig_L1(void); -extern void RCconfig_macrlc(int macrlc_has_f1[MAX_MAC_INST]); +extern void RCconfig_macrlc(void); extern void UE_config_stub_pnf(void); extern int RCconfig_gtpu(void ); extern void RCConfig(void); @@ -109,7 +109,7 @@ extern void RCConfig(void); void enb_config_display(void); void ru_config_display(void); -int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1); +int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc); int RCconfig_S1(MessageDef *msg_p, uint32_t i); void read_config_and_init(void); @@ -119,8 +119,5 @@ int RCconfig_M2(MessageDef *msg_p, uint32_t i); void fill_SL_configuration(RrcConfigurationReq *RRCcfg, ccparams_sidelink_t *SLconfig, int cell_idx, int cc_idx, char *config_fname); void fill_eMTC_configuration(RrcConfigurationReq *RRCcfg, ccparams_eMTC_t *eMTCconfig, int cell_idx, int cc_idx, char *config_fname, char *brparamspath); -int RCconfig_DU_F1(MessageDef *msg_p, uint32_t i); -void handle_f1ap_setup_resp(f1ap_setup_resp_t *resp); - #endif /* ENB_CONFIG_H_ */ /** @} */ diff --git a/openair2/F1AP/dummy_enb.c b/openair2/F1AP/dummy_enb.c deleted file mode 100644 index 942e652213d167512ea0c59bf0c2396c7fb9e088..0000000000000000000000000000000000000000 --- a/openair2/F1AP/dummy_enb.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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 "COMMON/platform_types.h" -#include "common/ran_context.h" -#include "common/utils/LOG/log.h" -#include "NR_BCCH-BCH-Message.h" -#include "NR_ServingCellConfigCommon.h" -#include "NR_MIB.h" - -bool sdap_data_req(protocol_ctxt_t *ctxt_p, - const ue_id_t ue_id, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const bool rqi, - const int pdusession_id) { -abort(); -} - -int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc) { - abort(); -} - -int rrc_gNB_generate_pcch_msg(uint32_t tmsi, - uint8_t paging_drx, - instance_t instance, - uint8_t CC_id) { - abort(); -} diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c index 0dfcefaef30f27126780deb02a974cf9e1167b04..9436b84ff7408f98f46967a63142b3c07048dcd4 100644 --- a/openair2/F1AP/f1ap_cu_interface_management.c +++ b/openair2/F1AP/f1ap_cu_interface_management.c @@ -142,15 +142,9 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, req->cell[i].nr_pci = servedCellInformation->nRPCI; LOG_D(F1AP, "req->nr_pci[%d] %d \n", i, req->cell[i].nr_pci); - // LTS: FIXME data model failure: we don't KNOW if we receive a 4G or a 5G cell - // Furthermore, cell_type is not a attribute of a cell in the data structure !!!!!!!!!! - if (RC.nrrrc && - ( RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU || - RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CUCP) ) - f1ap_req(true, instance)->cell_type=CELL_MACRO_GNB; - else - f1ap_req(true, instance)->cell_type=CELL_MACRO_ENB; - + // LTS: FIXME cell_type is not a attribute of a cell in the data structure !!!!!!!!!! + f1ap_req(true, instance)->cell_type = CELL_MACRO_GNB; + // FDD Cells if (servedCellInformation->nR_Mode_Info.present==F1AP_NR_Mode_Info_PR_fDD) { struct fdd_s *FDDs=&req->nr_mode_info[i].fdd; @@ -558,198 +552,6 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu } } - // c3. Cells_to_be_Deactivated_List - // - /* - if(!RC.nrrrc) { - // mandatory - // c3. Cells_to_be_Deactivated_List - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC3); - ieC3->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Deactivated_List; - ieC3->criticality = F1AP_Criticality_reject; - ieC3->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_Cells_to_be_Deactivated_List; - - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC3->value.choice.Cells_to_be_Deactivated_List.list, - F1AP_Cells_to_be_Deactivated_List_ItemIEs_t, cells_to_be_deactivated); - cells_to_be_deactivated->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item; - cells_to_be_deactivated->criticality = F1AP_Criticality_reject; - cells_to_be_deactivated->value.present = F1AP_Cells_to_be_Deactivated_List_ItemIEs__value_PR_Cells_to_be_Deactivated_List_Item; - // 3.1 cells to be Deactivated list item - F1AP_Cells_to_be_Deactivated_List_Item_t *cells_to_be_deactivated_list= - cells_to_be_deactivated->value.choice.Cells_to_be_Deactivated_List_Item; - addnRCGI(cells_to_be_deactivated_item->nRCGI, f1ap_setup_resp->cells_to_deactivate+i); - } - } - */ - - // c4. GNB_CU_TNL_Association_To_Add_List - /* - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC4); - ieC4->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Add_List; - ieC4->criticality = F1AP_Criticality_reject; - ieC4->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Add_List; - - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC4->value.choice.GNB_CU_TNL_Association_To_Add_List.list, - F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs_t, gnb_cu_tnl_association_to_add; - gnb_cu_tnl_association_to_add->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Add_Item; - gnb_cu_tnl_association_to_add->criticality = F1AP_Criticality_reject; - gnb_cu_tnl_association_to_add->value.present = F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Add_Item; - - // 4.1 GNB_CU_TNL_Association_To_Add_Item - F1AP_GNB_CU_TNL_Association_To_Add_Item_t *gnb_cu_tnl_association_to_add_item= - &gnb_cu_tnl_association_to_add_item_ies->value.choice.GNB_CU_TNL_Association_To_Add_Item; - - // 4.1.1 tNLAssociationTransportLayerAddress - F1AP_CP_TransportLayerAddress_t *transportLayerAddress=; - gnb_cu_tnl_association_to_add->value.choice.GNB_CU_TNL_Association_To_Add_Item; - - transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address; - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address); - - // memset((void *)&transportLayerAddress, 0, sizeof(F1AP_CP_TransportLayerAddress_t)); - // transportLayerAddress.present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address_and_port; - // transportLayerAddress.choice.endpoint_IP_address_and_port = (F1AP_Endpoint_IP_address_and_port_t *)calloc(1, sizeof(F1AP_Endpoint_IP_address_and_port_t)); - // TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress.choice.endpoint_IP_address_and_port.endpoint_IP_address); - - // 4.1.2 tNLAssociationUsage - gnb_cu_tnl_association_to_add_item->tNLAssociationUsage = F1AP_TNLAssociationUsage_non_ue; - } - */ - - /* - // c5. GNB_CU_TNL_Association_To_Remove_List - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC5); - ieC5->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Remove_List; - ieC5->criticality = F1AP_Criticality_reject; - ieC5->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Remove_List; - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC5->value.choice.GNB_CU_TNL_Association_To_Remove_List.list, - F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs_t, gnb_cu_tnl_association_to_remove); - gnb_cu_tnl_association_to_remove->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Remove_Item; - gnb_cu_tnl_association_to_remove->criticality = F1AP_Criticality_reject; - gnb_cu_tnl_association_to_remove->value.present = F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Remove_Item; - - // 4.1 GNB_CU_TNL_Association_To_Remove_Item - F1AP_GNB_CU_TNL_Association_To_Remove_Item_t *gnb_cu_tnl_association_to_remove_item= - &gnb_cu_tnl_association_to_remove->value.choice.GNB_CU_TNL_Association_To_Remove_Item; - - // 4.1.1 tNLAssociationTransportLayerAddress - F1AP_CP_TransportLayerAddress_t *transportLayerAddress= - &gnb_cu_tnl_association_to_remove_item->tNLAssociationTransportLayerAddress; - transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address; - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address); - - // memset((void *)&transportLayerAddress, 0, sizeof(F1AP_CP_TransportLayerAddress_t)); - // transportLayerAddress.present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address_and_port; - // transportLayerAddress.choice.endpoint_IP_address_and_port = (F1AP_Endpoint_IP_address_and_port_t *)calloc(1, sizeof(F1AP_Endpoint_IP_address_and_port_t)); - // TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress.choice.endpoint_IP_address_and_port.endpoint_IP_address); - } - */ - - /* - //mandatory - // c6. GNB_CU_TNL_Association_To_Update_List - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC6); - ieC6->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Update_List; - ieC6->criticality = F1AP_Criticality_reject; - ieC6->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Update_List; - - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC3->value.choice.GNB_CU_TNL_Association_To_Update_List.list, - F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs_t, gnb_cu_tnl_association_to_update); - gnb_cu_tnl_association_to_update->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Update_Item; - gnb_cu_tnl_association_to_update->criticality = F1AP_Criticality_reject; - gnb_cu_tnl_association_to_update->value.present = F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Update_Item; - // 4.1 GNB_CU_TNL_Association_To_Update_Item - F1AP_GNB_CU_TNL_Association_To_Update_Item_t *gnb_cu_tnl_association_to_update_item= - &gnb_cu_tnl_association_to_update->value.choice.GNB_CU_TNL_Association_To_Update_Item; - // 4.1.1 tNLAssociationTransportLayerAddress - F1AP_CP_TransportLayerAddress_t *transportLayerAddress= - &gnb_cu_tnl_association_to_update_item.tNLAssociationTransportLayerAddress; - transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address; - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address); - // memset((void *)&transportLayerAddress, 0, sizeof(F1AP_CP_TransportLayerAddress_t)); - // transportLayerAddress.present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address_and_port; - // transportLayerAddress.choice.endpoint_IP_address_and_port = (F1AP_Endpoint_IP_address_and_port_t *)calloc(1, sizeof(F1AP_Endpoint_IP_address_and_port_t)); - // TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress.choice.endpoint_IP_address_and_port.endpoint_IP_address); - // 4.1.2 tNLAssociationUsage - if (1) { - gnb_cu_tnl_association_to_update_item.tNLAssociationUsage = (F1AP_TNLAssociationUsage_t *)calloc(1, sizeof(F1AP_TNLAssociationUsage_t)); - *gnb_cu_tnl_association_to_update_item.tNLAssociationUsage = F1AP_TNLAssociationUsage_non_ue; - } - } - */ - - /* - // c7. Cells_to_be_Barred_List - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC7); - ieC7->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Barred_List; - ieC7->criticality = F1AP_Criticality_reject; - ieC7->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_Cells_to_be_Barred_List; - - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC7->value.choice.Cells_to_be_Barred_List.list, - F1AP_Cells_to_be_Barred_ItemIEs_t,cells_to_be_barred); - cells_to_be_barred->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item; - cells_to_be_barred->criticality = F1AP_Criticality_reject; - cells_to_be_barred->value.present = F1AP_Cells_to_be_Barred_ItemIEs__value_PR_Cells_to_be_Barred_Item; - // 7.1 cells to be Deactivated list item - F1AP_Cells_to_be_Barred_Item_t *cells_to_be_barred_item= - &cells_to_be_barred_item_ies->value.choice.Cells_to_be_Barred_Item; - // - nRCGI - addnRCGI(cells_to_be_barred_item->nRCGI, f1ap_gnb_cu_configuration_update->cells_to_activate+i); - // 7.2 cellBarred - cells_to_be_barred_item->cellBarred = F1AP_CellBarred_not_barred; - } - */ - - /* - // c8. Protected_EUTRA_Resources_List - asn1cSequenceAdd(cfgUpdate->protocolIEs.list, F1AP_GNBCUConfigurationUpdateIEs_t, ieC8); - ieC8->id = F1AP_ProtocolIE_ID_id_Protected_EUTRA_Resources_List; - ieC8->criticality = F1AP_Criticality_reject; - ieC8->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_Protected_EUTRA_Resources_List; - - for (int i=0; i<1; i++) { - asn1cSequenceAdd(ieC8->value.choice.Protected_EUTRA_Resources_List.list, - F1AP_Protected_EUTRA_Resources_ItemIEs_t, protected_eutra_resources); - // 8.1 SpectrumSharingGroupID - protected_eutra_resources->id = F1AP_ProtocolIE_ID_id_Protected_EUTRA_Resources_List; - protected_eutra_resources->criticality = F1AP_Criticality_reject; - protected_eutra_resources->value.present = F1AP_Protected_EUTRA_Resources_ItemIEs__value_PR_Protected_EUTRA_Resources_Item; - ((F1AP_Protected_EUTRA_Resources_Item_t *)&protected_eutra_resources->value.choice.Protected_EUTRA_Resources_Item)->spectrumSharingGroupID = 123L; - memset(&protected_eutra_resources->value.choice.Protected_EUTRA_Resources_Item,0, - sizeof(F1AP_Protected_EUTRA_Resources_Item_t)); - - asn1cSequenceAdd(protected_eutra_resources->value.choice.ListofEUTRACellsinGNBDUCoordination.list, - F1AP_Served_EUTRA_Cells_Information_t, served_eutra_cells_information); - memset((void *)&served_eutra_cells_information, 0, sizeof(F1AP_Served_EUTRA_Cells_Information_t)); - - F1AP_EUTRA_Mode_Info_t *eUTRA_Mode_Info= - &served_eutra_cells_information.eUTRA_Mode_Info; - - // eUTRAFDD - eUTRA_Mode_Info->present = F1AP_EUTRA_Mode_Info_PR_eUTRAFDD; - F1AP_EUTRA_FDD_Info_t *eutra_fdd_info = (F1AP_EUTRA_FDD_Info_t *)calloc(1, sizeof(F1AP_EUTRA_FDD_Info_t)); - eutra_fdd_info->uL_offsetToPointA = 123L; - eutra_fdd_info->dL_offsetToPointA = 456L; - eUTRA_Mode_Info.choice.eUTRAFDD = eutra_fdd_info; - - // eUTRATDD - // eUTRA_Mode_Info.present = F1AP_EUTRA_Mode_Info_PR_eUTRATDD; - // F1AP_EUTRA_TDD_Info_t *eutra_tdd_info; - // eutra_tdd_info = (F1AP_EUTRA_TDD_Info_t *)calloc(1, sizeof(F1AP_EUTRA_TDD_Info_t)); - // eutra_tdd_info->uL_offsetToPointA = 123L; - // eutra_tdd_info->dL_offsetToPointA = 456L; - // eUTRA_Mode_Info.choice.eUTRATDD = eutra_tdd_info; - - OCTET_STRING_fromBuf(&served_eutra_cells_information.protectedEUTRAResourceIndication, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); - } - */ - /* encode */ if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) { LOG_E(F1AP, "Failed to encode F1 gNB-CU CONFIGURATION UPDATE\n"); diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c index 09b36510351b8932ee5f3b399ac7704023c2d840..1710596a0ed7e849165eb9b113a4d597f08d17f2 100644 --- a/openair2/F1AP/f1ap_cu_task.c +++ b/openair2/F1AP/f1ap_cu_task.c @@ -123,12 +123,7 @@ void *F1AP_CU_task(void *arg) { eth_params_t *IPaddrs; // Hardcoded instance id! - if (RC.nrrrc && - (RC.nrrrc[0]->node_type == ngran_gNB_CU || - RC.nrrrc[0]->node_type == ngran_gNB_CUCP ) ) - IPaddrs=&RC.nrrrc[0]->eth_params_s; - else - IPaddrs=&RC.rrc[0]->eth_params_s; + IPaddrs = &RC.nrrrc[0]->eth_params_s; cu_task_send_sctp_init_req(0, IPaddrs->my_addr); diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c index d609cb98cbe3cf392a2b6ea76677011a697794f0..cdd97e93671f96133a7f10358380535cf05bf3e7 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.c +++ b/openair2/F1AP/f1ap_cu_ue_context_management.c @@ -39,7 +39,6 @@ #include "rrc_extern.h" #include "rrc_eNB_UE_context.h" -#include "openair2/RRC/NR/rrc_gNB_UE_context.h" #include "rrc_eNB_S1AP.h" #include "rrc_eNB_GTPV1U.h" #include "openair2/RRC/NR/rrc_gNB_NGAP.h" @@ -959,49 +958,15 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, protocol_ctxt_t ctxt; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance); - if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) { - struct rrc_gNB_ue_context_s *ue_context_p = - rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti); - - if (ue_context_p) { - MessageDef *msg = itti_alloc_new_message(TASK_CU_F1, 0, NGAP_UE_CONTEXT_RELEASE_COMPLETE); - NGAP_UE_CONTEXT_RELEASE_COMPLETE(msg).gNB_ue_ngap_id = ue_context_p->ue_context.gNB_ue_ngap_id; - itti_send_msg_to_task(TASK_NGAP, instance, msg); - rrc_gNB_remove_ue_context(&ctxt, RC.nrrrc[instance], ue_context_p); - } else { - LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti); - } + struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti); + if (ue_context_p) { + MessageDef *msg = itti_alloc_new_message(TASK_CU_F1, 0, NGAP_UE_CONTEXT_RELEASE_COMPLETE); + NGAP_UE_CONTEXT_RELEASE_COMPLETE(msg).gNB_ue_ngap_id = ue_context_p->ue_context.gNB_ue_ngap_id; + itti_send_msg_to_task(TASK_NGAP, instance, msg); + rrc_gNB_remove_ue_context(&ctxt, RC.nrrrc[instance], ue_context_p); } else { - struct rrc_eNB_ue_context_s *ue_context_p = - rrc_eNB_get_ue_context(RC.rrc[instance], rnti); - - if (ue_context_p) { - /* The following is normally done in the function rrc_rx_tx() */ - rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_CPLT(instance, - ue_context_p->ue_context.eNB_ue_s1ap_id); - rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(instance, ue_context_p); - - // erase data of GTP tunnels in UE context - for (int e_rab = 0; e_rab < ue_context_p->ue_context.nb_of_e_rabs; e_rab++) { - ue_context_p->ue_context.enb_gtp_teid[e_rab] = 0; - memset(&ue_context_p->ue_context.enb_gtp_addrs[e_rab], - 0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[e_rab])); - ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0; - } - - struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids = - rrc_eNB_S1AP_get_ue_ids(RC.rrc[instance], 0, - ue_context_p->ue_context.eNB_ue_s1ap_id); - - if (rrc_ue_s1ap_ids) - rrc_eNB_S1AP_remove_ue_ids(RC.rrc[instance], rrc_ue_s1ap_ids); - - /* trigger UE release in RRC */ - rrc_eNB_remove_ue_context(&ctxt, RC.rrc[instance], ue_context_p); - } else { - LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti); - } + LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti); } pdcp_remove_UE(&ctxt); diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c index d7e32d9dafb10ab244147c061c14905af23e0518..81c88ad04464d2a7e788a5ad4d145cdc183c3a9c 100644 --- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c +++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c @@ -58,38 +58,19 @@ #include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h" -int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, - uint32_t assoc_id, - uint32_t stream, - F1AP_F1AP_PDU_t *pdu); - /* DL RRC Message Transfer */ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { - LOG_I(F1AP, "node is gNB DU, call DU_handle_DL_NR_RRC_MESSAGE_TRANSFER \n"); - return DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance, assoc_id, stream, pdu); - } - - LOG_W(F1AP, "DU_handle_DL_RRC_MESSAGE_TRANSFER is a big race condition with rrc \n"); F1AP_DLRRCMessageTransfer_t *container; F1AP_DLRRCMessageTransferIEs_t *ie; uint64_t cu_ue_f1ap_id; uint64_t du_ue_f1ap_id; int executeDuplication; - sdu_size_t rrc_dl_sdu_len; //uint64_t subscriberProfileIDforRFP; //uint64_t rAT_FrequencySelectionPriority; DevAssert(pdu != NULL); - - if (stream != 0) { - LOG_E(F1AP, "[SCTP %d] Received F1 on stream != 0 (%d)\n", - assoc_id, stream); - return -1; - } - container = &pdu->choice.initiatingMessage->value.choice.DLRRCMessageTransfer; /* GNB_CU_UE_F1AP_ID */ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, @@ -102,8 +83,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID; LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n", du_ue_f1ap_id, - f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); - // this should be the one transmitted via initial ul rrc message transfer + f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer if (f1ap_du_add_cu_ue_id(instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) { LOG_E(F1AP, "Failed to find the F1AP UID \n"); @@ -138,8 +118,6 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, /* RRC Container */ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, F1AP_ProtocolIE_ID_id_RRCContainer, true); - rrc_dl_sdu_len = ie->value.choice.RRCContainer.size; - /* optional */ /* RAT_FrequencyPriorityInformation */ if (0) { @@ -161,359 +139,25 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, } } + f1ap_dl_rrc_message_t dl_rrc = { + .rrc_container_length = ie->value.choice.RRCContainer.size, + .rrc_container = ie->value.choice.RRCContainer.buf, + .rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id), + .srb_id = srb_id + }; + int rc = dl_rrc_message(instance, &dl_rrc); + if (rc == 0) + return 0; /* has been handled, otherwise continue below */ + // decode RRC Container and act on the message type AssertFatal(srb_id<3,"illegal srb_id\n"); - protocol_ctxt_t ctxt; - ctxt.rntiMaybeUEid = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); - ctxt.instance = instance; - ctxt.module_id = instance; - ctxt.enb_flag = 1; - struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rntiMaybeUEid); - - if (srb_id == 0) { - LTE_DL_CCCH_Message_t *dl_ccch_msg=NULL; - asn_dec_rval_t dec_rval; - dec_rval = uper_decode(NULL, - &asn_DEF_LTE_DL_CCCH_Message, - (void **)&dl_ccch_msg, - ie->value.choice.RRCContainer.buf, - rrc_dl_sdu_len,0,0); - AssertFatal(dec_rval.code == RC_OK, "could not decode F1AP message\n"); - - switch (dl_ccch_msg->message.choice.c1.present) { - case LTE_DL_CCCH_MessageType__c1_PR_NOTHING: - LOG_I(F1AP, "Received PR_NOTHING on DL-CCCH-Message\n"); - break; - - case LTE_DL_CCCH_MessageType__c1_PR_rrcConnectionReestablishment: - LOG_I(F1AP, - "Logical Channel DL-CCCH (SRB0), Received RRCConnectionReestablishment\n"); - break; - - case LTE_DL_CCCH_MessageType__c1_PR_rrcConnectionReestablishmentReject: - LOG_I(F1AP, - "Logical Channel DL-CCCH (SRB0), Received RRCConnectionReestablishmentReject\n"); - break; - - case LTE_DL_CCCH_MessageType__c1_PR_rrcConnectionReject: - LOG_I(F1AP, - "Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject \n"); - break; - - case LTE_DL_CCCH_MessageType__c1_PR_rrcConnectionSetup: { - LOG_I(F1AP, - "Logical Channel DL-CCCH (SRB0), Received RRCConnectionSetup DU_ID %lx/RNTI %x\n", - du_ue_f1ap_id, - f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); - // Get configuration - LTE_RRCConnectionSetup_t *rrcConnectionSetup = &dl_ccch_msg->message.choice.c1.choice.rrcConnectionSetup; - AssertFatal(rrcConnectionSetup!=NULL,"rrcConnectionSetup is null\n"); - LTE_RadioResourceConfigDedicated_t *radioResourceConfigDedicated = &rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated; - // get SRB logical channel information - LTE_SRB_ToAddModList_t *SRB_configList = radioResourceConfigDedicated->srb_ToAddModList; - AssertFatal(SRB_configList!=NULL,"SRB_configList is null\n"); - LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig = NULL; - - for (int cnt = 0; cnt < (SRB_configList)->list.count; cnt++) { - if ((SRB_configList)->list.array[cnt]->srb_Identity == 1) { - LTE_SRB_ToAddMod_t * SRB1_config = (SRB_configList)->list.array[cnt]; - - if (SRB1_config->logicalChannelConfig) { - if (SRB1_config->logicalChannelConfig->present == - LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { - SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } - } - } // for - - rrc_rlc_config_asn1_req(&ctxt, - SRB_configList, - (LTE_DRB_ToAddModList_t *) NULL, - (LTE_DRB_ToReleaseList_t *) NULL - , (LTE_PMCH_InfoList_r9_t *) NULL, - 0,0 - ); - // This should be somewhere in the f1ap_cudu_ue_inst_t - /*int macrlc_instance = 0; - - rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); - struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[macrlc_instance],rnti); - */ - eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context; - AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n"); - memcpy((void *)ue_p->Srb0.Tx_buffer.Payload, - (void *)ie->value.choice.RRCContainer.buf, - rrc_dl_sdu_len); // ie->value.choice.RRCContainer.size - ue_p->Srb0.Tx_buffer.payload_size = rrc_dl_sdu_len; - LTE_MAC_MainConfig_t *mac_MainConfig = NULL; - - if (radioResourceConfigDedicated->mac_MainConfig) - mac_MainConfig = &radioResourceConfigDedicated->mac_MainConfig->choice.explicitValue; - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.rnti = ctxt.rntiMaybeUEid; - tmp.physicalConfigDedicated = radioResourceConfigDedicated->physicalConfigDedicated; - tmp.mac_MainConfig = mac_MainConfig; - tmp.logicalChannelIdentity = 1; - tmp.logicalChannelConfig = SRB1_logicalChannelConfig; - rrc_mac_config_req_eNB(ctxt.instance, &tmp); - break; - } // case - - default: - AssertFatal(1==0, - "Unknown message\n"); - break; - }// switch case - - return(0); - } else if (srb_id == 1) { - LTE_DL_DCCH_Message_t *dl_dcch_msg=NULL; - asn_dec_rval_t dec_rval; - dec_rval = uper_decode(NULL, - &asn_DEF_LTE_DL_DCCH_Message, - (void **)&dl_dcch_msg, - &ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header - rrc_dl_sdu_len,0,0); - - if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) - LOG_E(F1AP," Failed to decode DL-DCCH (%zu bytes)\n",dec_rval.consumed); - else - LOG_D(F1AP, "Received message: present %d and c1 present %d\n", - dl_dcch_msg->message.present, dl_dcch_msg->message.choice.c1.present); - - if (dl_dcch_msg->message.present == LTE_DL_DCCH_MessageType_PR_c1) { - switch (dl_dcch_msg->message.choice.c1.present) { - case LTE_DL_DCCH_MessageType__c1_PR_NOTHING: - LOG_I(F1AP, "Received PR_NOTHING on DL-DCCH-Message\n"); - return 0; - - case LTE_DL_DCCH_MessageType__c1_PR_dlInformationTransfer: - LOG_I(F1AP,"Received NAS DL Information Transfer\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_csfbParametersResponseCDMA2000: - LOG_I(F1AP,"Received NAS sfbParametersResponseCDMA2000\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_handoverFromEUTRAPreparationRequest: - LOG_I(F1AP,"Received NAS andoverFromEUTRAPreparationRequest\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_mobilityFromEUTRACommand: - LOG_I(F1AP,"Received NAS mobilityFromEUTRACommand\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_rrcConnectionReconfiguration: - // handle RRCConnectionReconfiguration - LOG_I(F1AP, - "Logical Channel DL-DCCH (SRB1), Received RRCConnectionReconfiguration DU_ID %lx/RNTI %x\n", - du_ue_f1ap_id, - f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); - LTE_RRCConnectionReconfiguration_t *rrcConnectionReconfiguration = &dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration; - - if (rrcConnectionReconfiguration->criticalExtensions.present == LTE_RRCConnectionReconfiguration__criticalExtensions_PR_c1) { - if (rrcConnectionReconfiguration->criticalExtensions.choice.c1.present == - LTE_RRCConnectionReconfiguration__criticalExtensions__c1_PR_rrcConnectionReconfiguration_r8) { - LTE_RRCConnectionReconfiguration_r8_IEs_t *rrcConnectionReconfiguration_r8 = - &rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8; - - if (rrcConnectionReconfiguration_r8->mobilityControlInfo) { - LOG_I(F1AP, "Mobility Control Information is present\n"); - AssertFatal(1==0,"Can't handle this yet in DU\n"); - } - - if (rrcConnectionReconfiguration_r8->measConfig != NULL) { - LOG_I(F1AP, "Measurement Configuration is present\n"); - } - - if (rrcConnectionReconfiguration_r8->radioResourceConfigDedicated) { - LOG_I(F1AP, "Radio Resource Configuration is present\n"); - uint8_t DRB2LCHAN[8]; - long drb_id; - int i; - LTE_DRB_ToAddModList_t *DRB_configList = rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->drb_ToAddModList; - LTE_SRB_ToAddModList_t *SRB_configList = rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->srb_ToAddModList; - LTE_DRB_ToReleaseList_t *DRB_ReleaseList = rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->drb_ToReleaseList; - LTE_MAC_MainConfig_t *mac_MainConfig = NULL; - - for (i = 0; i< 8; i++) { - DRB2LCHAN[i] = 0; - } - - if (rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->mac_MainConfig) { - LOG_D(F1AP, "MAC Main Configuration is present\n"); - mac_MainConfig = &rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->mac_MainConfig->choice.explicitValue; - - /* CDRX Configuration */ - if (mac_MainConfig->drx_Config == NULL) { - LOG_W(F1AP, "drx_Configuration parameter is NULL, cannot configure local UE parameters or CDRX is deactivated\n"); - } else { - rrc_mac_drx_config_req_t req = {.rnti = ctxt.rntiMaybeUEid, .drx_Configuration = mac_MainConfig->drx_Config}; - /* Send DRX configuration to MAC task to configure timers of local UE context */ - eNB_Config_Local_DRX(instance, &req); - LOG_D(F1AP, "DRX configured in MAC Main Configuration for RRC Connection Reconfiguration\n"); - } - - /* End of CDRX configuration */ - } - - LTE_MeasGapConfig_t *measGapConfig = NULL; - struct LTE_PhysicalConfigDedicated *physicalConfigDedicated = rrcConnectionReconfiguration_r8->radioResourceConfigDedicated->physicalConfigDedicated; - rrc_rlc_config_asn1_req( - &ctxt, - SRB_configList, // NULL, //LG-RK 14/05/2014 SRB_configList, - DRB_configList, - DRB_ReleaseList, (LTE_PMCH_InfoList_r9_t *) NULL, 0, 0 - ); - - if (SRB_configList != NULL) { - for (i = 0; (i < SRB_configList->list.count) && (i < 3); i++) { - if (SRB_configList->list.array[i]->srb_Identity == 1 ) { - ue_context_p->ue_context.Srb1.Active=1; - } else if (SRB_configList->list.array[i]->srb_Identity == 2 ) { - ue_context_p->ue_context.Srb2.Active=1; - ue_context_p->ue_context.Srb2.Srb_info.Srb_id=2; - LOG_I(F1AP, "[DU %ld] SRB2 is now active\n",ctxt.instance); - } else { - LOG_W(F1AP, "[DU %ld] invalid SRB identity %ld\n",ctxt.instance, - SRB_configList->list.array[i]->srb_Identity); - } - } - } - - if (DRB_configList != NULL) { - for (i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8) - if (DRB_configList->list.array[i]) { - drb_id = (int)DRB_configList->list.array[i]->drb_Identity; - LOG_I(F1AP, - "[DU %ld] Logical Channel UL-DCCH, Received RRCConnectionReconfiguration for UE rnti %lx, reconfiguring DRB %d/LCID %d\n", - ctxt.instance, - ctxt.rntiMaybeUEid, - (int)DRB_configList->list.array[i]->drb_Identity, - (int)*DRB_configList->list.array[i]->logicalChannelIdentity); - - if (ue_context_p->ue_context.DRB_active[drb_id] == 0) { - ue_context_p->ue_context.DRB_active[drb_id] = 1; - - if (DRB_configList->list.array[i]->logicalChannelIdentity) { - DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->logicalChannelIdentity; - } - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.rnti = ue_context_p->ue_context.rnti; - tmp.physicalConfigDedicated = physicalConfigDedicated; - tmp.mac_MainConfig = mac_MainConfig; - tmp.logicalChannelIdentity = DRB2LCHAN[i]; - tmp.logicalChannelConfig = DRB_configList->list.array[i]->logicalChannelConfig; - tmp.measGapConfig = measGapConfig; - rrc_mac_config_req_eNB(ctxt.instance, &tmp); - } - } else { // remove LCHAN from MAC/PHY - AssertFatal(1==0,"Can't handle this yet in DU\n"); - } - } - } - } - } - } - - break; - - case LTE_DL_DCCH_MessageType__c1_PR_rrcConnectionRelease: - // handle RRCConnectionRelease - LOG_I(F1AP, "Received RRCConnectionRelease\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_securityModeCommand: - LOG_I(F1AP, "Received securityModeCommand\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry: - LOG_I(F1AP, "Received ueCapabilityEnquiry\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_counterCheck: - case LTE_DL_DCCH_MessageType__c1_PR_loggedMeasurementConfiguration_r10: - case LTE_DL_DCCH_MessageType__c1_PR_rnReconfiguration_r10: - case LTE_DL_DCCH_MessageType__c1_PR_spare1: - case LTE_DL_DCCH_MessageType__c1_PR_spare2: - case LTE_DL_DCCH_MessageType__c1_PR_spare3: - break; - - case LTE_DL_DCCH_MessageType__c1_PR_ueInformationRequest_r9: - LOG_I(F1AP, "Received ueInformationRequest_r9\n"); - break; - - case LTE_DL_DCCH_MessageType__c1_PR_rrcConnectionResume_r13: - LOG_I(F1AP, "Received rrcConnectionResume_r13\n"); - } - } - } else if (srb_id == 2) { - } - - LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", srb_id); - rlc_op_status_t rlc_status; - bool ret = true; - mem_block_t *pdcp_pdu_p = NULL; - pdcp_pdu_p = get_free_mem_block(rrc_dl_sdu_len, __func__); - - //LOG_I(F1AP, "PRRCContainer size %lu:", ie->value.choice.RRCContainer.size); - //for (int i = 0; i < ie->value.choice.RRCContainer.size; i++) - // printf("%02x ", ie->value.choice.RRCContainer.buf[i]); - - //printf (", PDCP PDU size %d:", rrc_dl_sdu_len); - //for (int i=0;i<rrc_dl_sdu_len;i++) printf("%2x ",pdcp_pdu_p->data[i]); - //printf("\n"); - - if (pdcp_pdu_p != NULL) { - memset(pdcp_pdu_p->data, 0, rrc_dl_sdu_len); - memcpy(&pdcp_pdu_p->data[0], ie->value.choice.RRCContainer.buf, rrc_dl_sdu_len); - rlc_status = rlc_data_req(&ctxt - , 1 - , MBMS_FLAG_NO - , srb_id - , 0 - , 0 - , rrc_dl_sdu_len - , pdcp_pdu_p - ,NULL - ,NULL - ); - - switch (rlc_status) { - case RLC_OP_STATUS_OK: - //LOG_I(F1AP, "Data sending request over RLC succeeded!\n"); - ret=true; - break; - - case RLC_OP_STATUS_BAD_PARAMETER: - LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - ret= false; - break; - - case RLC_OP_STATUS_INTERNAL_ERROR: - LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - ret= false; - break; - - case RLC_OP_STATUS_OUT_OF_RESSOURCES: - LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - ret= false; - break; - - default: - LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - ret= false; - break; - } // switch case - - return ret; - } // if pdcp_pdu_p - + MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION); + NRDuDlReq_t *req=&NRDuDlReq(msg); + req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); + req->srb_id=srb_id; + req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__); + memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size); + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg); return 0; } @@ -839,119 +483,3 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id); return 0; } - -/* DL NR RRC Message Transfer */ -int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, - uint32_t assoc_id, - uint32_t stream, - F1AP_F1AP_PDU_t *pdu) { - LOG_D(F1AP, "DU_handle_DL_NR_RRC_MESSAGE_TRANSFER \n"); - F1AP_DLRRCMessageTransfer_t *container; - F1AP_DLRRCMessageTransferIEs_t *ie; - uint64_t cu_ue_f1ap_id; - uint64_t du_ue_f1ap_id; - int executeDuplication; - //uint64_t subscriberProfileIDforRFP; - //uint64_t rAT_FrequencySelectionPriority; - DevAssert(pdu != NULL); - container = &pdu->choice.initiatingMessage->value.choice.DLRRCMessageTransfer; - /* GNB_CU_UE_F1AP_ID */ - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); - cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID; - LOG_D(F1AP, "cu_ue_f1ap_id %lu \n", cu_ue_f1ap_id); - /* GNB_DU_UE_F1AP_ID */ - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); - du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID; - LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n", - du_ue_f1ap_id, - f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer - - if (f1ap_du_add_cu_ue_id(instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) { - LOG_E(F1AP, "Failed to find the F1AP UID \n"); - //return -1; - } - - /* optional */ - /* oldgNB_DU_UE_F1AP_ID */ - if (0) { - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_oldgNB_DU_UE_F1AP_ID, true); - } - - /* mandatory */ - /* SRBID */ - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_SRBID, true); - uint64_t srb_id = ie->value.choice.SRBID; - LOG_D(F1AP, "srb_id %lu \n", srb_id); - - /* optional */ - /* ExecuteDuplication */ - if (0) { - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_ExecuteDuplication, true); - executeDuplication = ie->value.choice.ExecuteDuplication; - LOG_D(F1AP, "ExecuteDuplication %d \n", executeDuplication); - } - - // issue in here - /* mandatory */ - /* RRC Container */ - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_RRCContainer, true); - // BK: need check - // create an ITTI message and copy SDU - // message_p = itti_alloc_new_message (TASK_CU_F1, RRC_MAC_CCCH_DATA_IND); - // memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); - // memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, ie->value.choice.RRCContainer.buf, - // ccch_sdu_len); - - //LOG_I(F1AP, "%s() RRCContainer size %lu: ", __func__, ie->value.choice.RRCContainer.size); - //for (int i = 0;i < ie->value.choice.RRCContainer.size; i++) - // printf("%02x ", ie->value.choice.RRCContainer.buf[i]); - //printf("\n"); - - /* optional */ - /* RAT_FrequencyPriorityInformation */ - if (0) { - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container, - F1AP_ProtocolIE_ID_id_RAT_FrequencyPriorityInformation, true); - - switch(ie->value.choice.RAT_FrequencyPriorityInformation.present) { - case F1AP_RAT_FrequencyPriorityInformation_PR_eNDC: - //subscriberProfileIDforRFP = ie->value.choice.RAT_FrequencyPriorityInformation.choice.subscriberProfileIDforRFP; - break; - - case F1AP_RAT_FrequencyPriorityInformation_PR_nGRAN: - //rAT_FrequencySelectionPriority = ie->value.choice.RAT_FrequencyPriorityInformation.choice.rAT_FrequencySelectionPriority; - break; - - default: - LOG_W(F1AP, "unhandled IE RAT_FrequencyPriorityInformation.present\n"); - break; - } - } - - f1ap_dl_rrc_message_t dl_rrc = { - .rrc_container_length = ie->value.choice.RRCContainer.size, - .rrc_container = ie->value.choice.RRCContainer.buf, - .rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id), - .srb_id = srb_id - }; - int rc = dl_rrc_message(instance, &dl_rrc); - if (rc == 0) - return 0; /* has been handled, otherwise continue below */ - - // decode RRC Container and act on the message type - AssertFatal(srb_id<3,"illegal srb_id\n"); - MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION); - NRDuDlReq_t *req=&NRDuDlReq(msg); - req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); - req->srb_id=srb_id; - req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__); - memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size); - itti_send_msg_to_task(TASK_RRC_GNB, instance, msg); - return 0; -} diff --git a/openair2/F1AP/f1ap_du_task.c b/openair2/F1AP/f1ap_du_task.c index c11316e19b6bec3583838d1969684c015f9cea77..29b15ae2bbc9c87a567bc36e5410b86e8ce0cfc0 100644 --- a/openair2/F1AP/f1ap_du_task.c +++ b/openair2/F1AP/f1ap_du_task.c @@ -150,14 +150,7 @@ void *F1AP_DU_task(void *arg) { } break; case F1AP_UL_RRC_MESSAGE: // to rrc - if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_DU) { - DU_send_UL_NR_RRC_MESSAGE_TRANSFER(myInstance, - &F1AP_UL_RRC_MESSAGE(msg)); - } else { - DU_send_UL_RRC_MESSAGE_TRANSFER(myInstance, - &F1AP_UL_RRC_MESSAGE(msg)); - } - + DU_send_UL_NR_RRC_MESSAGE_TRANSFER(myInstance, &F1AP_UL_RRC_MESSAGE(msg)); break; case F1AP_UE_CONTEXT_SETUP_RESP: diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c index 23ab58c6edf4455c3e0d6264bcba77e044d7c1b8..85282f742cac5ee659afe0f99dd207e3203fd658 100644 --- a/openair2/F1AP/f1ap_du_ue_context_management.c +++ b/openair2/F1AP/f1ap_du_ue_context_management.c @@ -182,23 +182,6 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, 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_setup_req->rnti, - drb_p->drb_id, - drb_p->drb_id, - drb_p->up_ul_tnl[0].teid, - -1, // no qfi - addr, - drb_p->up_ul_tnl[0].port, - lteDURecvCb, - NULL); - drb_p->up_dl_tnl_length++; - } } } @@ -242,11 +225,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, LOG_W(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer); } - if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) - itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); - else - // in 4G, race conditon is to fix - DU_send_UE_CONTEXT_SETUP_RESPONSE(instance, f1ap_ue_context_setup_req); + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); return 0; } @@ -670,146 +649,6 @@ 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, - uint32_t assoc_id, - uint32_t stream, - F1AP_F1AP_PDU_t *pdu) { - F1AP_UEContextReleaseCommand_t *container; - F1AP_UEContextReleaseCommandIEs_t *ie; - protocol_ctxt_t ctxt; - 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); - 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); - 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.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { - UE_iterator(RC.nrmac[instance]->UE_info.list, UE) { - if (UE->rnti == rnti) { - UE_out_of_sync = 0; - break; - } - } - if (!UE) - LOG_E(F1AP,"Not found rnti: %x\n", rnti); - } else { - for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) { - if (RC.mac[instance]->UE_info.active[n] == true - && 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) { - // 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; - } - } - - if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { - // struct rrc_gNB_ue_context_s *ue_context_p; - f1ap_ue_context_release_cplt_t cplt; - cplt.rnti = ctxt.rnti; - DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt); - 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_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, uint32_t assoc_id, @@ -817,7 +656,6 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, 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 @@ -830,159 +668,48 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, // 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.rntiMaybeUEid = 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; - } + f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_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, 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.rntiMaybeUEid == rnti, "RNTI obtained through DU ID (%x) is different from CU ID (%lx)\n", rnti, ctxt.rntiMaybeUEid); - } - 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; - } - } - } + 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); // 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; + 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); - 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.rntiMaybeUEid); - - 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.rntiMaybeUEid; - LOG_D(F1AP, "add rrc_release_info RNTI %lx\n", ctxt.rntiMaybeUEid); - // 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 %lx mui %d flag %d \n", release_num, ctxt.rntiMaybeUEid, 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); - } + 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; - // TODO send this once the connection has really been released - f1ap_ue_context_release_cplt_t cplt; - cplt.rnti = ctxt.rntiMaybeUEid; - DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt); - return 0; } + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); + return 0; } int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, @@ -1199,22 +926,6 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, 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, - -1, // no qfi - addr, - drb_p->up_ul_tnl[0].port, - lteDURecvCb, - NULL); - drb_p->up_dl_tnl_length++; - } } } /* RRC Reconfiguration Complete indicator */ diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 166980da14180615622baf67293bf0959df79c75..b7cbac42561001ece3bfce4996a190d6100b4c4d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -468,25 +468,9 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id, // check threshold if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 4000) { // note: probably ul_failure_timer should be less than UE radio link failure time(see T310/N310/N311) - if (NODE_IS_DU(RC.rrc[module_idP]->node_type)) { - MessageDef *m = itti_alloc_new_message(TASK_PHY_ENB, 0, F1AP_UE_CONTEXT_RELEASE_REQ); - F1AP_UE_CONTEXT_RELEASE_REQ(m).rnti = rnti; - F1AP_UE_CONTEXT_RELEASE_REQ(m).cause = F1AP_CAUSE_RADIO_NETWORK; - F1AP_UE_CONTEXT_RELEASE_REQ(m).cause_value = 1; // 1 = F1AP_CauseRadioNetwork_rl_failure - F1AP_UE_CONTEXT_RELEASE_REQ(m).rrc_container = NULL; - F1AP_UE_CONTEXT_RELEASE_REQ(m).rrc_container_length = 0; - itti_send_msg_to_task(TASK_DU_F1, module_idP, m); - } else { - // inform RRC of failure and clear timer - LOG_I(MAC, "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", - UE_id, - rnti); - mac_eNB_rrc_ul_failure(module_idP, - CC_id, - frameP, - subframeP, - rnti); - } + // inform RRC of failure and clear timer + LOG_I(MAC, "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", UE_id, rnti); + mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP, rnti); UE_info->UE_sched_ctrl[UE_id].ul_failure_timer = 0; UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync = 1; @@ -973,14 +957,12 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, } // end for loop on UE_id #if (!defined(PRE_SCD_THREAD)) - if (!NODE_IS_DU(RC.rrc[module_idP]->node_type)) { - void rlc_tick(int, int); - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, subframeP, module_idP); - rlc_tick(frameP, subframeP); - pdcp_run(&ctxt); - pdcp_mbms_run(&ctxt); - rrc_rx_tx(&ctxt, CC_id); - } + void rlc_tick(int, int); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, subframeP, module_idP); + rlc_tick(frameP, subframeP); + pdcp_run(&ctxt); + pdcp_mbms_run(&ctxt); + rrc_rx_tx(&ctxt, CC_id); #endif int do_fembms_si=0; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 03ff38611a9f8f05b8cb4d9eb9f15549f44e8230..f1fefc6973c744374a9f892134001133fa6af3fe 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -138,35 +138,6 @@ extern int oai_exit; pthread_t pdcp_stats_thread_desc; -bool cu_f1u_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t mode, - const uint32_t *const sourceL2Id, - const uint32_t *const destinationL2Id - ) { - mem_block_t *memblock = get_free_mem_block(sdu_buffer_size, __func__); - if (memblock == NULL) { - LOG_E(RLC, "%s:%d:%s: ERROR: get_free_mem_block failed\n", __FILE__, __LINE__, __FUNCTION__); - exit(1); - } - memcpy(memblock->data,sdu_buffer, sdu_buffer_size); - // weird rb id management in 4G, not fully understand (looks bad design) - // overcomplex: if i understand, on the interface DRB start at 4 because there can be SRB 0..3 - // but it would be much simpler to use absolute numbering - // instead of this "srb flag" associated to these +/-4 - int ret=pdcp_data_ind(ctxt_pP,srb_flagP, false, rb_id-4, sdu_buffer_size, memblock, NULL, NULL); - if (!ret) { - LOG_E(RLC, "%s:%d:%s: ERROR: pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__); - /* what to do in case of failure? for the moment: nothing */ - } - return ret; -} void *pdcp_stats_thread(void *param) { FILE *fd; @@ -204,31 +175,6 @@ uint64_t get_pdcp_optmask(void) { return pdcp_params.optmask; } -rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt, - const srb_flag_t srb_flag, const MBMS_flag_t MBMS_flag, - const rb_id_t rb_id, const mui_t mui, - confirm_t confirm, sdu_size_t size, mem_block_t *sdu, - const uint32_t *const sourceID, const uint32_t *const destID) { - MessageDef *message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, 0, GTPV1U_TUNNEL_DATA_REQ, - sizeof(gtpv1u_tunnel_data_req_t) + - size + GTPU_HEADER_OVERHEAD_MAX ); - AssertFatal(message_p != NULL, "OUT OF MEMORY"); - gtpv1u_tunnel_data_req_t *req=>PV1U_TUNNEL_DATA_REQ(message_p); - req->buffer = (uint8_t*)(req+1); - memcpy(req->buffer + GTPU_HEADER_OVERHEAD_MAX, - sdu->data, - size ); - req->length = size; - req->offset = GTPU_HEADER_OVERHEAD_MAX; - req->ue_id = ctxt->rntiMaybeUEid; - req->bearer_id = rb_id+4; - LOG_D(PDCP, "%s() (drb %ld) sending message to gtp size %d\n", - __func__, rb_id, size); - extern instance_t CUuniqInstance; - itti_send_msg_to_task(TASK_GTPV1_U, CUuniqInstance, message_p); - return true; -} - //----------------------------------------------------------------------------- /* * If PDCP_UNIT_TEST is set here then data flow between PDCP and RLC is broken @@ -326,7 +272,7 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, LOG_UI(PDCP, "Before rlc_data_req 1, srb_flagP: %d, rb_idP: %ld \n", srb_flagP, rb_idP); } - rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)?MBMS_FLAG_NO:MBMS_FLAG_YES, rb_idP, muiP, + rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_YES, rb_idP, muiP, confirmP, sdu_buffer_sizeP, pdcp_pdu_p,NULL,NULL); } else { rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES; @@ -488,98 +434,73 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, "[MSG] PDCP DL %s PDU on rb_id %ld\n",(srb_flagP)? "CONTROL" : "DATA", rb_idP); if ((pdcp_pdu_p!=NULL) && (srb_flagP == 0) && (ctxt_pP->enb_flag == 1)) { - LOG_D(PDCP, "pdcp data req on drb %ld, size %d, rnti %lx, node_type %d \n", rb_idP, pdcp_pdu_size, ctxt_pP->rntiMaybeUEid, RC.rrc ? RC.rrc[ctxt_pP->module_id]->node_type : -1); - - if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) { - LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type); - ret = false; - } else { - rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, - confirmP, pdcp_pdu_size, pdcp_pdu_p,sourceL2Id, - destinationL2Id); - ret = false; - switch (rlc_status) { - case RLC_OP_STATUS_OK: - LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); - ret=true; - break; + LOG_D(PDCP, "pdcp data req on drb %ld, size %d, rnti %lx\n", rb_idP, pdcp_pdu_size, ctxt_pP->rntiMaybeUEid); + + rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, + confirmP, pdcp_pdu_size, pdcp_pdu_p,sourceL2Id, + destinationL2Id); + ret = false; + switch (rlc_status) { + case RLC_OP_STATUS_OK: + LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); + ret=true; + break; - case RLC_OP_STATUS_BAD_PARAMETER: - LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - break; + case RLC_OP_STATUS_BAD_PARAMETER: + LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); + break; - case RLC_OP_STATUS_INTERNAL_ERROR: - LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - break; + case RLC_OP_STATUS_INTERNAL_ERROR: + LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); + break; - case RLC_OP_STATUS_OUT_OF_RESSOURCES: - LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - break; + case RLC_OP_STATUS_OUT_OF_RESSOURCES: + LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); + break; - default: - LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - break; - } // switch case - } /* end if node_type is not DU */ + default: + LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); + break; + } // switch case } else { // SRB - if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - // DL transfer - MessageDef *message_p; - // Note: the acyual task must be TASK_PDCP_ENB, but this task is not created - message_p = itti_alloc_new_message (TASK_PDCP_ENB, 0, F1AP_DL_RRC_MESSAGE); - F1AP_DL_RRC_MESSAGE (message_p).rrc_container = &pdcp_pdu_p->data[0] ; - F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = pdcp_pdu_size; - F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0; - F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0; - F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown - F1AP_DL_RRC_MESSAGE(message_p).rnti = ctxt_pP->rntiMaybeUEid; - F1AP_DL_RRC_MESSAGE (message_p).srb_id = rb_idP; - F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1; - F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0; - itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p); - //CU_send_DL_RRC_MESSAGE_TRANSFER(ctxt_pP->module_id, message_p); - LOG_I(PDCP, "Send F1AP_DL_RRC_MESSAGE with ITTI\n"); - ret=true; - } else { - rlc_status = rlc_data_req(ctxt_pP - , srb_flagP - , MBMS_FLAG_NO - , rb_idP - , muiP - , confirmP - , pdcp_pdu_size - , pdcp_pdu_p - ,NULL - ,NULL - ); - - switch (rlc_status) { - case RLC_OP_STATUS_OK: - LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); - ret=true; - break; + rlc_status = rlc_data_req(ctxt_pP + , srb_flagP + , MBMS_FLAG_NO + , rb_idP + , muiP + , confirmP + , pdcp_pdu_size + , pdcp_pdu_p + ,NULL + ,NULL + ); + + switch (rlc_status) { + case RLC_OP_STATUS_OK: + LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); + ret=true; + break; - case RLC_OP_STATUS_BAD_PARAMETER: - LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - ret= false; - break; + case RLC_OP_STATUS_BAD_PARAMETER: + LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); + ret= false; + break; - case RLC_OP_STATUS_INTERNAL_ERROR: - LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - ret= false; - break; + case RLC_OP_STATUS_INTERNAL_ERROR: + LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); + ret= false; + break; - case RLC_OP_STATUS_OUT_OF_RESSOURCES: - LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - ret= false; - break; + case RLC_OP_STATUS_OUT_OF_RESSOURCES: + LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); + ret= false; + break; - default: - LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - ret= false; - break; - } // switch case - } + default: + LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); + ret= false; + break; + } // switch case } } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 944e641358d36c8997f21111a541808cb30df325..b4303d1fdd80108e4fc074801193c6db6179d7ef 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -420,10 +420,6 @@ pdcp_data_ind_func_t get_pdcp_data_ind_func(void); //----------------------------------------------------------------------------- int pdcp_fifo_flush_mbms_sdus ( const protocol_ctxt_t *const ctxt_pP); int pdcp_fifo_read_input_mbms_sdus_fromtun ( const protocol_ctxt_t *const ctxt_pP); -rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt_pP, - const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP, - const rb_id_t rb_idP, const mui_t muiP, - confirm_t confirmP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP, const uint32_t *const, const uint32_t *const); /* * Following two types are utilized between NAS driver and PDCP diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c index 87c922246824a4b73c59a770ae256dc4c14e631d..d45640bbfa05bfd5309fd373cfbf5efa5af8cad5 100644 --- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c +++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c @@ -412,37 +412,6 @@ rb_found: T(T_ENB_RLC_UL, T_INT(0 /*ctxt_pP->module_id*/), T_INT(ue->rnti), T_INT(rb_id), T_INT(size)); - - const ngran_node_t type = RC.rrc[0 /*ctxt_pP->module_id*/]->node_type; - AssertFatal(!NODE_IS_CU(type), - "Can't be CU, bad node type %d\n", type); - - if (NODE_IS_DU(type)) { - if (is_srb == 1) { - MessageDef *msg = itti_alloc_new_message_sized(TASK_RLC_ENB, 0, F1AP_UL_RRC_MESSAGE, sizeof(*msg) + size); - F1AP_UL_RRC_MESSAGE(msg).rrc_container = (uint8_t*)(msg+1); - memcpy(F1AP_UL_RRC_MESSAGE(msg).rrc_container, buf, size); - F1AP_UL_RRC_MESSAGE(msg).rnti = ue->rnti; - F1AP_UL_RRC_MESSAGE(msg).srb_id = rb_id; - F1AP_UL_RRC_MESSAGE(msg).rrc_container_length = size; - itti_send_msg_to_task(TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(0 /*ctxt_pP->module_id*/), msg); - return; - } else { - // Fixme: very dirty workaround of incomplete F1-U implementation - instance_t DUuniqInstance=0; - MessageDef *msg = itti_alloc_new_message_sized(TASK_RLC_ENB, 0, GTPV1U_TUNNEL_DATA_REQ, sizeof(gtpv1u_tunnel_data_req_t) + size); - gtpv1u_tunnel_data_req_t *req=>PV1U_TUNNEL_DATA_REQ(msg); - req->buffer=(uint8_t*)(req+1); - memcpy(req->buffer,buf,size); - req->length=size; - req->offset=0; - req->ue_id=ue->rnti; - req->bearer_id=rb_id+4; - LOG_D(RLC, "Received uplink user-plane traffic at RLC-DU to be sent to the CU, size %d \n", size); - itti_send_msg_to_task(TASK_GTPV1_U, DUuniqInstance, msg); - return; - } - } } memblock = get_free_mem_block(size, __func__); diff --git a/openair2/M2AP/m2ap_MCE.c b/openair2/M2AP/m2ap_MCE.c index f163aa453a47fdcd622d565950d422db6c879cbf..e5e924e0181dae7b5e74a7fcafb7d9272f1cf8da 100644 --- a/openair2/M2AP/m2ap_MCE.c +++ b/openair2/M2AP/m2ap_MCE.c @@ -111,9 +111,7 @@ void m2ap_MCE_handle_sctp_association_resp(instance_t instance, sctp_new_associa sctp_new_association_resp->ulp_cnx_id); if (sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN) - //proto_agent_stop(instance); - //f1ap_handle_setup_message(instance, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); - return; // exit -1 for debugging + return; } // go to an init func diff --git a/openair2/M2AP/m2ap_MCE_interface_management.c b/openair2/M2AP/m2ap_MCE_interface_management.c index 0ece50b88e29075ff8bf5166e6bcbba3924ff951..58a4c7b967d044ee648b002daacc78188da56a3b 100644 --- a/openair2/M2AP/m2ap_MCE_interface_management.c +++ b/openair2/M2AP/m2ap_MCE_interface_management.c @@ -75,7 +75,7 @@ int MCE_send_MBMS_SESSION_START_REQUEST(instance_t instance/*, uint32_t assoc_id ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_MCE_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -140,7 +140,7 @@ int MCE_send_MBMS_SESSION_START_REQUEST(instance_t instance/*, uint32_t assoc_id // ie->id = M2AP_ProtocolIE_ID_id_TNL_Information_1; // ie->criticality = M2AP_Criticality_reject; // ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_TNL_Information_1; - // //asn_int642INTEGER(&ie->value.choice.MBMS_Session_ID, f1ap_du_data->MBMS_Session_ID); //? + // //asn_int642INTEGER(&ie->value.choice.MBMS_Session_ID, 0); // asn1cSeqAdd(&out->protocolIEs.list, ie); } @@ -258,7 +258,7 @@ int MCE_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m2ap_session_stop_re ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStopRequest_Ies__value_PR_MCE_MBMS_M2AP_ID; - ie->value.choice.MCE_MBMS_M2AP_ID = 0; /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -267,7 +267,7 @@ int MCE_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m2ap_session_stop_re ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStopRequest_Ies__value_PR_ENB_MBMS_M2AP_ID; - ie->value.choice.ENB_MBMS_M2AP_ID = 0;/*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + ie->value.choice.ENB_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -1437,7 +1437,7 @@ int MCE_handle_MBMS_SESSION_COUNTING_FAILURE(instance_t instance, module_id_t d ie->id = M2AP_ProtocolIE_ID_id_MBSFN_Area_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_MbmsServiceCountingRequest_Ies__value_PR_MBSFN_Area_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ diff --git a/openair2/M2AP/m2ap_eNB_generate_messages.c b/openair2/M2AP/m2ap_eNB_generate_messages.c index 89c83a87018a6e1ac5e2a952466cd00eb2f5456f..8e7e096d13be5c03ffe34a9db16a690ca2b548e1 100644 --- a/openair2/M2AP/m2ap_eNB_generate_messages.c +++ b/openair2/M2AP/m2ap_eNB_generate_messages.c @@ -92,7 +92,7 @@ // //ie->id = M2AP_ProtocolIE_ID_id_gNB_eNB_ID; // //ie->criticality = M2AP_Criticality_reject; // //ie->value.present = M2AP_M2SetupRequestIEs__value_PR_GNB_eNB_ID; -// //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, f1ap_du_data->gNB_eNB_id); +// //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, 0); // //asn1cSeqAdd(&out->protocolIEs.list, ie); // // /* optional */ diff --git a/openair2/M2AP/m2ap_eNB_interface_management.c b/openair2/M2AP/m2ap_eNB_interface_management.c index df3f060226e602a0658cf4af65b5fe414c7e8623..a336a559a323bdc30b9940b2167b919077877497 100644 --- a/openair2/M2AP/m2ap_eNB_interface_management.c +++ b/openair2/M2AP/m2ap_eNB_interface_management.c @@ -234,7 +234,7 @@ int eNB_send_MBMS_SCHEDULING_INFORMATION_RESPONSE(instance_t instance, m2ap_mbms // ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; // ie->criticality = M2AP_Criticality_reject; // ie->value.present = M2AP_MbmsSchedulingInformationResponse_Ies__value_PR_MCE_MBMS_M2AP_ID; -// //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? +// //ie->value.choice.MCE_MBMS_M2AP_ID = 0; // asn1cSeqAdd(&out->protocolIEs.list, ie); // // /* mandatory */ @@ -243,7 +243,7 @@ int eNB_send_MBMS_SCHEDULING_INFORMATION_RESPONSE(instance_t instance, m2ap_mbms // ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID; // ie->criticality = M2AP_Criticality_reject; // ie->value.present = M2AP_MbmsSchedulingInformationResponse_Ies__value_PR_ENB_MBMS_M2AP_ID; -// //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? +// //ie->value.choice.MCE_MBMS_M2AP_ID = 0; // asn1cSeqAdd(&out->protocolIEs.list, ie); // @@ -329,7 +329,7 @@ int eNB_send_MBMS_SESSION_START_RESPONSE(instance_t instance, m2ap_session_start ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStartResponse_Ies__value_PR_MCE_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -338,7 +338,7 @@ int eNB_send_MBMS_SESSION_START_RESPONSE(instance_t instance, m2ap_session_start ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStartResponse_Ies__value_PR_ENB_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -395,7 +395,7 @@ int eNB_send_MBMS_SESSION_START_FAILURE(instance_t instance, m2ap_session_start_ ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStartFailure_Ies__value_PR_MCE_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -493,7 +493,7 @@ int eNB_send_MBMS_SESSION_STOP_RESPONSE(instance_t instance, m2ap_session_stop_r ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStopResponse_Ies__value_PR_MCE_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -502,7 +502,7 @@ int eNB_send_MBMS_SESSION_STOP_RESPONSE(instance_t instance, m2ap_session_stop_r ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_SessionStopResponse_Ies__value_PR_ENB_MBMS_M2AP_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -579,7 +579,7 @@ int eNB_send_M2_SETUP_REQUEST(m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t* //ie->id = M2AP_ProtocolIE_ID_id_gNB_eNB_ID; //ie->criticality = M2AP_Criticality_reject; //ie->value.present = M2AP_M2SetupRequestIEs__value_PR_GNB_eNB_ID; - //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, f1ap_du_data->gNB_eNB_id); + //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, 0); //asn1cSeqAdd(&out->protocolIEs.list, ie); /* optional */ @@ -1290,7 +1290,7 @@ int eNB_send_MBMS_SERVICE_COUNTING_REPORT(instance_t instance, m2ap_mbms_service ie->id = M2AP_ProtocolIE_ID_id_MBSFN_Area_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_MbmsServiceCountingResultsReport_Ies__value_PR_MBSFN_Area_ID; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -1299,7 +1299,7 @@ int eNB_send_MBMS_SERVICE_COUNTING_REPORT(instance_t instance, m2ap_mbms_service ie->id = M2AP_ProtocolIE_ID_id_MBMS_Counting_Result_List; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_MbmsServiceCountingResultsReport_Ies__value_PR_MBMS_Counting_Result_List; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; M2AP_MBMS_Counting_Result_List_t * m2ap_mbms_counting_result_list = &ie->value.choice.MBMS_Counting_Result_List; M2AP_MBMS_Counting_Result_Item_t * m2ap_mbms_counting_result_item = (M2AP_MBMS_Counting_Result_Item_t*)calloc(1,sizeof(M2AP_MBMS_Counting_Result_Item_t)); @@ -1356,7 +1356,7 @@ int eNB_send_MBMS_SERVICE_COUNTING_RESP(instance_t instance, m2ap_mbms_service_c ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_MbmsServiceCountingResponse_Ies__value_PR_CriticalityDiagnostics; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); if (m2ap_encode_pdu(&pdu, &buffer, &len) < 0) { @@ -1395,7 +1395,7 @@ int eNB_send_MBMS_SERVICE_COUNTING_FAILURE(instance_t instance, m2ap_mbms_servic ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID; ie->criticality = M2AP_Criticality_reject; ie->value.present = M2AP_MbmsServiceCountingFailure_Ies__value_PR_CriticalityDiagnostics; - //ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M2AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ diff --git a/openair2/MCE_APP/mce_app.c b/openair2/MCE_APP/mce_app.c index e626a09a9866bf06811afdb08a6c7cb3c0f6129f..c832df55855e31b34de200337cb421a530dcd2e9 100644 --- a/openair2/MCE_APP/mce_app.c +++ b/openair2/MCE_APP/mce_app.c @@ -67,7 +67,7 @@ static m2ap_setup_req_t * m2ap_setup_req_local = NULL; /*------------------------------------------------------------------------------*/ -static uint32_t MCE_app_register(ngran_node_t node_type,uint32_t mce_id_start, uint32_t mce_id_end) { +static uint32_t MCE_app_register(uint32_t mce_id_start, uint32_t mce_id_end) { uint32_t mce_id; MessageDef *msg_p; uint32_t register_mce_pending = 0; @@ -87,17 +87,7 @@ static uint32_t MCE_app_register(ngran_node_t node_type,uint32_t mce_id_start, u LOG_I(ENB_APP,"[MCE %d] MCE_app_register via M3AP for instance %d\n", mce_id, ENB_MODULE_ID_TO_INSTANCE(mce_id)); itti_send_msg_to_task (TASK_M3AP, ENB_MODULE_ID_TO_INSTANCE(mce_id), msg_p); - //if (NODE_IS_DU(node_type)) { // F1AP registration - // // configure F1AP here for F1C - // LOG_I(ENB_APP,"ngran_eNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n"); - // msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, F1AP_SETUP_REQ); - // RCconfig_DU_F1(msg_p, enb_id); - - // LOG_I(ENB_APP,"[eNB %d] eNB_app_register via F1AP for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); - // itti_send_msg_to_task (TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - // // configure GTPu here for F1U - //} - //else { // S1AP registration + //{ // S1AP registration // /* note: there is an implicit relationship between the data structure and the message name */ // msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, S1AP_REGISTER_ENB_REQ); // RCconfig_S1(msg_p, enb_id); @@ -340,39 +330,37 @@ void *MCE_app_task(void *args_p) { itti_mark_task_ready (TASK_MCE_APP); /* Try to register each MCE */ - // This assumes that node_type of all RRC instances is the same if ( EPC_MODE_ENABLED && RC.rrc == NULL ) LOG_E(RRC, "inconsistent global variables\n"); if (EPC_MODE_ENABLED && RC.rrc ) { - register_mce_pending = MCE_app_register(RC.rrc[0]->node_type, mce_id_start, mce_id_end); + register_mce_pending = MCE_app_register(mce_id_start, mce_id_end); } /* Try to register each MCE with each other */ - // if (is_x2ap_enabled() && !NODE_IS_DU(RC.rrc[0]->node_type)) { + // if (is_x2ap_enabled()) { // x2_register_enb_pending = MCE_app_register_x2 (enb_id_start, enb_id_end); // } // MCE_app_send_MME_APP2(0); + if (is_m2ap_MCE_enabled()) { + RCconfig_MCE(); - if (is_m2ap_MCE_enabled() /*&& !NODE_IS_DU(RC.rrc[0]->node_type)*/) { - RCconfig_MCE(); - - if(!m2ap_mbms_scheduling_information_local) - m2ap_mbms_scheduling_information_local = (m2ap_mbms_scheduling_information_t*)calloc(1,sizeof(m2ap_mbms_scheduling_information_t)); - if(m2ap_mbms_scheduling_information_local) - RCconfig_m2_scheduling(m2ap_mbms_scheduling_information_local,0); + if (!m2ap_mbms_scheduling_information_local) + m2ap_mbms_scheduling_information_local = (m2ap_mbms_scheduling_information_t *)calloc(1, sizeof(m2ap_mbms_scheduling_information_t)); + if (m2ap_mbms_scheduling_information_local) + RCconfig_m2_scheduling(m2ap_mbms_scheduling_information_local, 0); - if(!m2ap_setup_resp_local) - m2ap_setup_resp_local = (m2ap_setup_resp_t*)calloc(1,sizeof(m2ap_setup_resp_t)); - if(m2ap_setup_resp_local) - RCconfig_m2_mcch(m2ap_setup_resp_local,0); - } + if (!m2ap_setup_resp_local) + m2ap_setup_resp_local = (m2ap_setup_resp_t *)calloc(1, sizeof(m2ap_setup_resp_t)); + if (m2ap_setup_resp_local) + RCconfig_m2_mcch(m2ap_setup_resp_local, 0); + } // /* Try to register each MCE with MCE each other */ - if (is_m3ap_MCE_enabled() /*&& !NODE_IS_DU(RC.rrc[0]->node_type)*/) { - ///*m3_register_mce_pending =*/ - MCE_app_register_m3 (mce_id_start, mce_id_end); - } + if (is_m3ap_MCE_enabled()) { + ///*m3_register_mce_pending =*/ + MCE_app_register_m3(mce_id_start, mce_id_end); + } do { // Wait for a message @@ -390,7 +378,6 @@ void *MCE_app_task(void *args_p) { break; case M3AP_REGISTER_MCE_CNF: - //AssertFatal(!NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received S1AP_REGISTER_ENB_CNF\n"); LOG_I(MCE_APP, "[MCE %ld] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), M3AP_REGISTER_MCE_CNF(msg_p).nb_mme); DevAssert(register_mce_pending > 0); @@ -451,12 +438,7 @@ void *MCE_app_task(void *args_p) { case M3AP_SETUP_RESP: LOG_I(MCE_APP, "Received M3AP_SETUP_RESP message %s\n", ITTI_MSG_NAME (msg_p)); - // //AssertFatal(NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received F1AP_REGISTER_ENB_CNF in CU/MCE\n"); - // //LOG_I(MCE_APP, "Received %s: associated ngran_MCE_CU %s with %d cells to activate\n", ITTI_MSG_NAME (msg_p), - // //F1AP_SETUP_RESP(msg_p).gNB_CU_name,F1AP_SETUP_RESP(msg_p).num_cells_to_activate); - // - // //handle_f1ap_setup_resp(&F1AP_SETUP_RESP(msg_p)); // handle_m3ap_setup_resp(&M3AP_SETUP_RESP(msg_p)); // DevAssert(register_mce_pending > 0); diff --git a/openair2/MCE_APP/mce_config.h b/openair2/MCE_APP/mce_config.h index dbed65221ac241351f56291e64ca174bc5cb7818..858f09db17b8ca71193a55983c495fe4f3dece42 100644 --- a/openair2/MCE_APP/mce_config.h +++ b/openair2/MCE_APP/mce_config.h @@ -40,7 +40,6 @@ #include "PHY/impl_defs_top.h" #include "PHY/defs_eNB.h" #include "s1ap_messages_types.h" -#include "f1ap_messages_types.h" #include "LTE_SystemInformationBlockType2.h" #include "rrc_messages_types.h" #include "RRC/LTE/rrc_defs.h" diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c index c6d2d1ae68059c803de0133f53c19773999424b2..e0bf90cff2fddf592f30814fe0d0b97c8611c001 100644 --- a/openair2/RRC/LTE/L2_interface.c +++ b/openair2/RRC/LTE/L2_interface.c @@ -47,7 +47,6 @@ #include "intertask_interface.h" -#include "openair2/F1AP/f1ap_du_rrc_message_transfer.h" extern RAN_CONTEXT_t RC; @@ -302,28 +301,6 @@ mac_rrc_data_ind( ) //-------------------------------------------------------------------------- { - if (NODE_IS_DU(RC.rrc[module_idP]->node_type)) { - LOG_W(RRC,"[DU %d][RAPROC] Received SDU for CCCH on SRB %ld length %d for UE id %d RNTI %x \n", - module_idP, srb_idP, sdu_lenP, UE_id, rntiP); - /* do ITTI message */ - DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER( - module_idP, - CC_id, - UE_id, - rntiP, - sduP, - sdu_lenP, - NULL, - 0); - struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_allocate_new_UE_context(RC.rrc[module_idP]); - ue_context_p->ue_id_rnti = rntiP; - ue_context_p->ue_context.rnti = rntiP; - ue_context_p->ue_context.random_ue_identity = rntiP; - ue_context_p->ue_context.Srb0.Active = 1; - RB_INSERT(rrc_ue_tree_s, &RC.rrc[module_idP]->rrc_ue_head, ue_context_p); - return(0); - } - //SRB_INFO *Srb_info; protocol_ctxt_t ctxt; sdu_size_t sdu_size = 0; diff --git a/openair2/RRC/LTE/L2_interface_common.c b/openair2/RRC/LTE/L2_interface_common.c index 21ecc07b057e454e056f1bd46dfd20f8c752ada1..6a0830e6df1f9ac6cd0046028a904739424459dd 100644 --- a/openair2/RRC/LTE/L2_interface_common.c +++ b/openair2/RRC/LTE/L2_interface_common.c @@ -88,12 +88,6 @@ rrc_data_req( message_p); LOG_I(RRC,"sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB\n"); - /* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads - * Ideally, PDCP would not neet to be triggered like this but react to ITTI - * messages automatically */ - if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) - pdcp_run(ctxt_pP); - return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index ecf2cd12f15619138081965bb88ac6d0b2ac5a11..6ce27da5ce41421e64a7bba7940ceb00efe5ef24 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -742,7 +742,6 @@ typedef struct { typedef struct eNB_RRC_INST_s { /// southbound midhaul configuration - ngran_node_t node_type; eth_params_t eth_params_s; char *node_name; uint32_t node_id; diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 999d1d5a71707d864939f0940ca4d211177079ab..24ec163b2e6cd2e19d6c390a6b741b83d3be841c 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -237,193 +237,161 @@ init_SI( carrier->SIB1 = (uint8_t *) malloc16(32); AssertFatal(carrier->SIB1!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1 allocated\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - LOG_I(RRC,"[eNB %d] Node type %d \n ", ctxt_pP->module_id, rrc->node_type); - - if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { - // copy basic Cell parameters - carrier->physCellId = configuration->Nid_cell[CC_id]; - carrier->p_eNB = configuration->nb_antenna_ports[CC_id]; - carrier->Ncp = configuration->prefix_type[CC_id]; - carrier->dl_CarrierFreq = configuration->downlink_frequency[CC_id]; - carrier->ul_CarrierFreq = configuration->downlink_frequency[CC_id]+ configuration->uplink_frequency_offset[CC_id]; - carrier->eutra_band = configuration->eutra_band[CC_id]; - carrier->N_RB_DL = configuration->N_RB_DL[CC_id]; - carrier->pbch_repetition = configuration->pbch_repetition[CC_id]; - LOG_I(RRC, "configuration->schedulingInfoSIB1_BR_r13[CC_id] %d\n",(int)configuration->schedulingInfoSIB1_BR_r13[CC_id]); - LOG_A(RRC, "Configuring MIB (N_RB_DL %d,phich_Resource %d,phich_Duration %d)\n", - (int)configuration->N_RB_DL[CC_id], - (int)configuration->radioresourceconfig[CC_id].phich_resource, - (int)configuration->radioresourceconfig[CC_id].phich_duration); - carrier->sizeof_MIB = do_MIB(&rrc->carrier[CC_id], - configuration->N_RB_DL[CC_id], - configuration->radioresourceconfig[CC_id].phich_resource, - configuration->radioresourceconfig[CC_id].phich_duration, - 0, - configuration->schedulingInfoSIB1_BR_r13[CC_id] - ); - carrier->sizeof_SIB1 = do_SIB1(&rrc->carrier[CC_id], - ctxt_pP->module_id, - CC_id, - false, - configuration - ); - AssertFatal(carrier->sizeof_SIB1 != 255,"FATAL, RC.rrc[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); - RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = 0; - - if (configuration->schedulingInfoSIB1_BR_r13[CC_id] > 0) { - RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_BR = (uint8_t *) malloc16(32); - RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = do_SIB1(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id], - ctxt_pP->module_id, - CC_id, true, configuration); - } - } - if (!NODE_IS_DU(rrc->node_type)) { - carrier->SIB23 = (uint8_t *) malloc16(64); - AssertFatal(carrier->SIB23!=NULL,"cannot allocate memory for SIB"); - carrier->sizeof_SIB23 = do_SIB23(ctxt_pP->module_id, - CC_id, - false, - configuration - ); - LOG_I(RRC,"do_SIB23, size %d \n ", carrier->sizeof_SIB23); - AssertFatal(carrier->sizeof_SIB23 != 255,"FATAL, RC.rrc[mod].carrier[CC_id].sizeof_SIB23 == 255"); - carrier->sizeof_SIB23_BR = 0; - - if (configuration->schedulingInfoSIB1_BR_r13[CC_id]>0) { - carrier->SIB23_BR = (uint8_t *) malloc16(64); - AssertFatal(carrier->SIB23_BR!=NULL,"cannot allocate memory for SIB"); - carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, true, configuration); + // copy basic Cell parameters + carrier->physCellId = configuration->Nid_cell[CC_id]; + carrier->p_eNB = configuration->nb_antenna_ports[CC_id]; + carrier->Ncp = configuration->prefix_type[CC_id]; + carrier->dl_CarrierFreq = configuration->downlink_frequency[CC_id]; + carrier->ul_CarrierFreq = configuration->downlink_frequency[CC_id] + configuration->uplink_frequency_offset[CC_id]; + carrier->eutra_band = configuration->eutra_band[CC_id]; + carrier->N_RB_DL = configuration->N_RB_DL[CC_id]; + carrier->pbch_repetition = configuration->pbch_repetition[CC_id]; + LOG_I(RRC, "configuration->schedulingInfoSIB1_BR_r13[CC_id] %d\n", (int)configuration->schedulingInfoSIB1_BR_r13[CC_id]); + LOG_A(RRC, + "Configuring MIB (N_RB_DL %d,phich_Resource %d,phich_Duration %d)\n", + (int)configuration->N_RB_DL[CC_id], + (int)configuration->radioresourceconfig[CC_id].phich_resource, + (int)configuration->radioresourceconfig[CC_id].phich_duration); + carrier->sizeof_MIB = do_MIB(&rrc->carrier[CC_id], + configuration->N_RB_DL[CC_id], + configuration->radioresourceconfig[CC_id].phich_resource, + configuration->radioresourceconfig[CC_id].phich_duration, + 0, + configuration->schedulingInfoSIB1_BR_r13[CC_id]); + carrier->sizeof_SIB1 = do_SIB1(&rrc->carrier[CC_id], ctxt_pP->module_id, CC_id, false, configuration); + AssertFatal(carrier->sizeof_SIB1 != 255, "FATAL, RC.rrc[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = 0; + + if (configuration->schedulingInfoSIB1_BR_r13[CC_id] > 0) { + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_BR = (uint8_t *)malloc16(32); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = do_SIB1(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id], ctxt_pP->module_id, CC_id, true, configuration); + } + + carrier->SIB23 = (uint8_t *)malloc16(64); + AssertFatal(carrier->SIB23 != NULL, "cannot allocate memory for SIB"); + carrier->sizeof_SIB23 = do_SIB23(ctxt_pP->module_id, CC_id, false, configuration); + LOG_I(RRC, "do_SIB23, size %d \n ", carrier->sizeof_SIB23); + AssertFatal(carrier->sizeof_SIB23 != 255, "FATAL, RC.rrc[mod].carrier[CC_id].sizeof_SIB23 == 255"); + carrier->sizeof_SIB23_BR = 0; + + if (configuration->schedulingInfoSIB1_BR_r13[CC_id] > 0) { + carrier->SIB23_BR = (uint8_t *)malloc16(64); + AssertFatal(carrier->SIB23_BR != NULL, "cannot allocate memory for SIB"); + carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, true, configuration); + } + + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT " SIB2/3 Contents (partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT " pusch_config_common.n_SB = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.hoppingMode = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.pusch_HoppingOffset = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.enable64QAM = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.groupHoppingEnabled = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.groupAssignmentPUSCH = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.sequenceHoppingEnabled = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + LOG_T(RRC, + PROTOCOL_RRC_CTXT_FMT " pusch_config_common.cyclicShift = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); + + if (carrier->MBMS_flag > 0) { + for (i = 0; i < carrier->sib2->mbsfn_SubframeConfigList->list.count; i++) { + // SIB 2 + // LOG_D(RRC, "[eNB %ld] mbsfn_SubframeConfigList.list.count = %ld\n", enb_mod_idP, RC.rrc[enb_mod_idP].sib2->mbsfn_SubframeConfigList->list.count); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT " SIB13 contents for MBSFN subframe allocation %d/%d(partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i, carrier->sib2->mbsfn_SubframeConfigList->list.count); + LOG_D(RRC, + PROTOCOL_RRC_CTXT_FMT " mbsfn_Subframe_pattern is = %x\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); + LOG_D(RRC, + PROTOCOL_RRC_CTXT_FMT " radioframe_allocation_period = %ld (just index number, not the real value)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT " radioframe_allocation_offset = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); } - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.n_SB = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.hoppingMode = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.pusch_HoppingOffset = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.enable64QAM = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupHoppingEnabled = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupAssignmentPUSCH = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.sequenceHoppingEnabled = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.cyclicShift = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); - - if (carrier->MBMS_flag > 0) { - for (i = 0; i < carrier->sib2->mbsfn_SubframeConfigList->list.count; i++) { - // SIB 2 - // LOG_D(RRC, "[eNB %ld] mbsfn_SubframeConfigList.list.count = %ld\n", enb_mod_idP, RC.rrc[enb_mod_idP].sib2->mbsfn_SubframeConfigList->list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN subframe allocation %d/%d(partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - i, - carrier->sib2->mbsfn_SubframeConfigList->list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" mbsfn_Subframe_pattern is = %x\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_period = %ld (just index number, not the real value)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_offset = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); - } - - // SIB13 - for (i = 0; i < carrier->sib13->mbsfn_AreaInfoList_r9.list.count; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/%d (partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - i, - carrier->sib13->mbsfn_AreaInfoList_r9.list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %ld (just index number, not real value)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); - } - } else memset((void *)&RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13,0,sizeof(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13)); - - //TTN - SIB 18 - if (configuration->SL_configured > 0) { - for (int j = 0; j < carrier->sib18->commConfig_r12->commRxPool_r12.list.count; j++) { - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Contents of SIB18 %d/%d \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - j+1, - carrier->sib18->commConfig_r12->commRxPool_r12.list.count); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 rxPool_sc_CP_Len: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_CP_Len_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 sc_Period_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_Period_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 data_CP_Len_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->data_CP_Len_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 prb_Num_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_Num_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 prb_Start_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_Start_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 prb_End_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_End_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 offsetIndicator: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB18 subframeBitmap_choice_bs_buf: %s \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs16_r12.buf); - } + // SIB13 + for (i = 0; i < carrier->sib13->mbsfn_AreaInfoList_r9.list.count; i++) { + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT " SIB13 contents for MBSFN sync area %d/%d (partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i, carrier->sib13->mbsfn_AreaInfoList_r9.list.count); + LOG_D(RRC, + PROTOCOL_RRC_CTXT_FMT " MCCH Repetition Period: %ld (just index number, not real value)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT " MCCH Offset: %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); + } + } else + memset((void *)&RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13, 0, sizeof(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13)); + + // TTN - SIB 18 + if (configuration->SL_configured > 0) { + for (int j = 0; j < carrier->sib18->commConfig_r12->commRxPool_r12.list.count; j++) { + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " Contents of SIB18 %d/%d \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), j + 1, carrier->sib18->commConfig_r12->commRxPool_r12.list.count); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB18 rxPool_sc_CP_Len: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_CP_Len_r12); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB18 sc_Period_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_Period_r12); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB18 data_CP_Len_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->data_CP_Len_r12); + LOG_I( + RRC, PROTOCOL_RRC_CTXT_FMT " SIB18 prb_Num_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_Num_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB18 prb_Start_r12: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_Start_r12); + LOG_I( + RRC, PROTOCOL_RRC_CTXT_FMT " SIB18 prb_End_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.prb_End_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB18 offsetIndicator: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB18 subframeBitmap_choice_bs_buf: %s \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib18->commConfig_r12->commRxPool_r12.list.array[j]->sc_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs16_r12.buf); + } - //TTN - SIB 19 - for (int j = 0; j < carrier->sib19->discConfig_r12->discRxPool_r12.list.count; j++) { - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Contents of SIB19 %d/%d \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - j+1, - carrier->sib19->discConfig_r12->discRxPool_r12.list.count); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 cp_Len_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->cp_Len_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 discPeriod_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->discPeriod_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 numRetx_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->numRetx_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 numRepetition_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->numRepetition_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 tf_ResourceConfig_r12 prb_Num_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_Num_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 tf_ResourceConfig_r12 prb_Start_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_Start_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 tf_ResourceConfig_r12 prb_End_r12: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_End_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 tf_ResourceConfig_r12 offsetIndicator: %ld \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12); - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" SIB19 tf_ResourceConfig_r12 subframeBitmap_choice_bs_buf: %s \n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.subframeBitmap_r12.choice.bs16_r12.buf); - } + // TTN - SIB 19 + for (int j = 0; j < carrier->sib19->discConfig_r12->discRxPool_r12.list.count; j++) { + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " Contents of SIB19 %d/%d \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), j + 1, carrier->sib19->discConfig_r12->discRxPool_r12.list.count); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB19 cp_Len_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->cp_Len_r12); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB19 discPeriod_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->discPeriod_r12); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB19 numRetx_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->numRetx_r12); + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " SIB19 numRepetition_r12: %ld \n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->numRepetition_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB19 tf_ResourceConfig_r12 prb_Num_r12: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_Num_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB19 tf_ResourceConfig_r12 prb_Start_r12: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_Start_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB19 tf_ResourceConfig_r12 prb_End_r12: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.prb_End_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB19 tf_ResourceConfig_r12 offsetIndicator: %ld \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12); + LOG_I(RRC, + PROTOCOL_RRC_CTXT_FMT " SIB19 tf_ResourceConfig_r12 subframeBitmap_choice_bs_buf: %s \n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + carrier->sib19->discConfig_r12->discRxPool_r12.list.array[j]->tf_ResourceConfig_r12.subframeBitmap_r12.choice.bs16_r12.buf); } } @@ -432,72 +400,61 @@ init_SI( PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); // LTE-M stuff here (take out CU-DU for now) - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - if ((carrier->mib.message.schedulingInfoSIB1_BR_r13>0) && - (carrier->sib1_BR!=NULL)) { - AssertFatal(carrier->sib1_BR->nonCriticalExtension!=NULL, - "sib2_br->nonCriticalExtension is null (v8.9)\n"); - AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension!=NULL, - "sib2_br->nonCriticalExtension is null (v9.2)\n"); - AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, - "sib2_br->nonCriticalExtension is null (v11.3)\n"); - AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, - "sib2_br->nonCriticalExtension is null (v12.5)\n"); - AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, - "sib2_br->nonCriticalExtension is null (v13.10)\n"); - sib1_v13ext = carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension; - // Basic Asserts for CE_level0 PRACH configuration - LTE_RadioResourceConfigCommonSIB_t *radioResourceConfigCommon_BR = &carrier[CC_id].sib2_BR->radioResourceConfigCommon; - struct LTE_PRACH_ConfigSIB_v1310 *ext4_prach=radioResourceConfigCommon_BR->ext4->prach_ConfigCommon_v1310; - LTE_PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13; - AssertFatal(prach_ParametersListCE_r13->list.count>0,"prach_ParametersListCE_r13 is empty\n"); - LTE_PRACH_ParametersCE_r13_t *p = prach_ParametersListCE_r13->list.array[0]; - AssertFatal(p->prach_StartingSubframe_r13 != NULL, "prach_StartingSubframe_r13 celevel0 is null\n"); - AssertFatal((1<<p->numRepetitionPerPreambleAttempt_r13)<=(2<<*p->prach_StartingSubframe_r13), - "prachce0->numReptitionPerPreambleAttempt_r13 %d > prach_StartingSubframe_r13 %d\n", - 1<<p->numRepetitionPerPreambleAttempt_r13, - 2<<*p->prach_StartingSubframe_r13); - } - } - - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - LOG_D(RRC, "About to call rrc_mac_config_req_eNB for ngran_eNB\n"); - rrc_mac_config_req_eNB_t tmp = { - .CC_id = CC_id, - .physCellId = carrier->physCellId, - .p_eNB = carrier->p_eNB, - .Ncp = carrier->Ncp, - .eutra_band = carrier->sib1->freqBandIndicator, - .dl_CarrierFreq = carrier->dl_CarrierFreq, - .pbch_repetition = carrier->pbch_repetition, - .mib = &carrier->mib, - .radioResourceConfigCommon = &carrier->sib2->radioResourceConfigCommon, - .tdd_Config = carrier->sib1->tdd_Config, - .schedulingInfoList = &carrier->sib1->schedulingInfoList, - .ul_CarrierFreq = carrier->ul_CarrierFreq, - .ul_Bandwidth = carrier->sib2->freqInfo.ul_Bandwidth, - .additionalSpectrumEmission = &carrier->sib2->freqInfo.additionalSpectrumEmission, - .mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList, - .MBMS_Flag = carrier->MBMS_flag, - .sib1_ext_r13 = sib1_v13ext, - .FeMBMS_Flag = RC.rrc[ctxt_pP->module_id]->carrier[CC_id].FeMBMS_flag, - .mib_fembms = &carrier->siblock1_MBMS, - }; - if (carrier->sib2_BR) - tmp.LTE_radioResourceConfigCommon_BR = &carrier->sib2_BR->radioResourceConfigCommon; - if (carrier->sib13) - tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; - if (carrier->sib1_MBMS) { - tmp.nonMBSFN_SubframeConfig = carrier->sib1_MBMS->nonMBSFN_SubframeConfig_r14; - tmp.sib1_mbms_r14_fembms = carrier->sib1_MBMS->systemInformationBlockType13_r14; - if (carrier->sib1_MBMS->systemInformationBlockType13_r14) - tmp.mbsfn_AreaInfoList_fembms = &carrier->sib1_MBMS->systemInformationBlockType13_r14->mbsfn_AreaInfoList_r9; - } - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); + if ((carrier->mib.message.schedulingInfoSIB1_BR_r13 > 0) && (carrier->sib1_BR != NULL)) { + AssertFatal(carrier->sib1_BR->nonCriticalExtension != NULL, "sib2_br->nonCriticalExtension is null (v8.9)\n"); + AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension != NULL, "sib2_br->nonCriticalExtension is null (v9.2)\n"); + AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension != NULL, "sib2_br->nonCriticalExtension is null (v11.3)\n"); + AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension != NULL, "sib2_br->nonCriticalExtension is null (v12.5)\n"); + AssertFatal(carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension != NULL, + "sib2_br->nonCriticalExtension is null (v13.10)\n"); + sib1_v13ext = carrier->sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension; + // Basic Asserts for CE_level0 PRACH configuration + LTE_RadioResourceConfigCommonSIB_t *radioResourceConfigCommon_BR = &carrier[CC_id].sib2_BR->radioResourceConfigCommon; + struct LTE_PRACH_ConfigSIB_v1310 *ext4_prach = radioResourceConfigCommon_BR->ext4->prach_ConfigCommon_v1310; + LTE_PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13; + AssertFatal(prach_ParametersListCE_r13->list.count > 0, "prach_ParametersListCE_r13 is empty\n"); + LTE_PRACH_ParametersCE_r13_t *p = prach_ParametersListCE_r13->list.array[0]; + AssertFatal(p->prach_StartingSubframe_r13 != NULL, "prach_StartingSubframe_r13 celevel0 is null\n"); + AssertFatal((1 << p->numRepetitionPerPreambleAttempt_r13) <= (2 << *p->prach_StartingSubframe_r13), + "prachce0->numReptitionPerPreambleAttempt_r13 %d > prach_StartingSubframe_r13 %d\n", + 1 << p->numRepetitionPerPreambleAttempt_r13, + 2 << *p->prach_StartingSubframe_r13); + } + + LOG_D(RRC, "About to call rrc_mac_config_req_eNB for ngran_eNB\n"); + rrc_mac_config_req_eNB_t tmp = { + .CC_id = CC_id, + .physCellId = carrier->physCellId, + .p_eNB = carrier->p_eNB, + .Ncp = carrier->Ncp, + .eutra_band = carrier->sib1->freqBandIndicator, + .dl_CarrierFreq = carrier->dl_CarrierFreq, + .pbch_repetition = carrier->pbch_repetition, + .mib = &carrier->mib, + .radioResourceConfigCommon = &carrier->sib2->radioResourceConfigCommon, + .tdd_Config = carrier->sib1->tdd_Config, + .schedulingInfoList = &carrier->sib1->schedulingInfoList, + .ul_CarrierFreq = carrier->ul_CarrierFreq, + .ul_Bandwidth = carrier->sib2->freqInfo.ul_Bandwidth, + .additionalSpectrumEmission = &carrier->sib2->freqInfo.additionalSpectrumEmission, + .mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList, + .MBMS_Flag = carrier->MBMS_flag, + .sib1_ext_r13 = sib1_v13ext, + .FeMBMS_Flag = RC.rrc[ctxt_pP->module_id]->carrier[CC_id].FeMBMS_flag, + .mib_fembms = &carrier->siblock1_MBMS, + }; + if (carrier->sib2_BR) + tmp.LTE_radioResourceConfigCommon_BR = &carrier->sib2_BR->radioResourceConfigCommon; + if (carrier->sib13) + tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; + if (carrier->sib1_MBMS) { + tmp.nonMBSFN_SubframeConfig = carrier->sib1_MBMS->nonMBSFN_SubframeConfig_r14; + tmp.sib1_mbms_r14_fembms = carrier->sib1_MBMS->systemInformationBlockType13_r14; + if (carrier->sib1_MBMS->systemInformationBlockType13_r14) + tmp.mbsfn_AreaInfoList_fembms = &carrier->sib1_MBMS->systemInformationBlockType13_r14->mbsfn_AreaInfoList_r9; } + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - /* set flag to indicate that cell information is configured. This is required - * in DU to trigger F1AP_SETUP procedure */ pthread_mutex_lock(&rrc->cell_info_mutex); rrc->cell_info_configured=1; pthread_mutex_unlock(&rrc->cell_info_mutex); @@ -512,8 +469,6 @@ init_MCCH( //----------------------------------------------------------------------------- { int sync_area = 0; - // initialize RRC_eNB_INST MCCH entry - eNB_RRC_INST *rrc = RC.rrc[enb_mod_idP]; RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE = malloc(RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area * sizeof(uint8_t *)); @@ -546,19 +501,10 @@ init_MCCH( RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESS[sync_area].Active = 1; } - //Set the RC.rrc[enb_mod_idP]->MCCH_MESS.Active to 1 (allow to transfer MCCH message RRC->MAC in function mac_rrc_data_req) - // ??Configure MCCH logical channel - // call mac_config_req with appropriate structure from ASN.1 description - // LOG_I(RRC, "DUY: serviceID is %d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->tmgi_r9.serviceId_r9.buf[2]); - // LOG_I(RRC, "DUY: session ID is %d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->sessionId_r9->buf[0]); - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.pmch_InfoList = &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9; - rrc_mac_config_req_eNB(enb_mod_idP, &tmp); - } - - //LOG_I(RRC,"DUY: lcid after rrc_mac_config_req is %02d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9); + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.pmch_InfoList = &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9; + rrc_mac_config_req_eNB(enb_mod_idP, &tmp); } //----------------------------------------------------------------------------- @@ -587,14 +533,12 @@ static void init_MBMS( , &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) ,NULL); - if (!NODE_IS_CU(RC.rrc[enb_mod_idP]->node_type)) { - rrc_rlc_config_asn1_req(&ctxt, - NULL, // LTE_SRB_ToAddModList - NULL, // LTE_DRB_ToAddModList - NULL, // DRB_ToReleaseList - &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9),0, 0 - ); - } + rrc_rlc_config_asn1_req(&ctxt, + NULL, // LTE_SRB_ToAddModList + NULL, // LTE_DRB_ToAddModList + NULL, // DRB_ToReleaseList + &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9),0, 0 + ); //rrc_mac_config_req(); } @@ -897,35 +841,24 @@ rrc_eNB_free_UE( } if(EPC_MODE_ENABLED) { - if (!NODE_IS_DU(RC.rrc[enb_mod_idP]->node_type)) { - if((ue_context_pP->ue_context.ul_failure_timer >= 20000) && (mac_eNB_get_rrc_status(enb_mod_idP, rnti) >= RRC_CONNECTED)) { - LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ sent for RNTI %x, cause 21, radio connection with ue lost\n", - enb_mod_idP, - rnti); - rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, - ue_context_pP, - S1AP_CAUSE_RADIO_NETWORK, - 21); // send cause 21: radio connection with ue lost - /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) - * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before - * triggering the S1 UE Context Release Request procedure in order to allow the UE to perform the NAS recovery - * procedure, see TS 23.401 [17]. - */ - return; - } + if ((ue_context_pP->ue_context.ul_failure_timer >= 20000) && (mac_eNB_get_rrc_status(enb_mod_idP, rnti) >= RRC_CONNECTED)) { + LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ sent for RNTI %x, cause 21, radio connection with ue lost\n", enb_mod_idP, rnti); + rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, + 21); // send cause 21: radio connection with ue lost + /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) + * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before + * triggering the S1 UE Context Release Request procedure in order to allow the UE to perform the NAS recovery + * procedure, see TS 23.401 [17]. + */ + return; + } - if((ue_context_pP->ue_context.ue_rrc_inactivity_timer >= RC.rrc[enb_mod_idP]->configuration.rrc_inactivity_timer_thres) && - (mac_eNB_get_rrc_status(enb_mod_idP, rnti) >= RRC_CONNECTED) && - (RC.rrc[enb_mod_idP]->configuration.rrc_inactivity_timer_thres > 0)) { - LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ sent for RNTI %x, cause 20, user inactivity\n", - enb_mod_idP, - rnti); - rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, - ue_context_pP, - S1AP_CAUSE_RADIO_NETWORK, - 20); // send cause 20: user inactivity - return; - } + if ((ue_context_pP->ue_context.ue_rrc_inactivity_timer >= RC.rrc[enb_mod_idP]->configuration.rrc_inactivity_timer_thres) && (mac_eNB_get_rrc_status(enb_mod_idP, rnti) >= RRC_CONNECTED) + && (RC.rrc[enb_mod_idP]->configuration.rrc_inactivity_timer_thres > 0)) { + LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ sent for RNTI %x, cause 20, user inactivity\n", enb_mod_idP, rnti); + rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, + 20); // send cause 20: user inactivity + return; } } @@ -1023,20 +956,10 @@ void release_UE_in_freeList(module_id_t mod_id) { } } - if (!NODE_IS_CU(RC.rrc[mod_id]->node_type)) { - if (!eNB_MAC->UE_free_ctrl[ue_num].raFlag) - rrc_mac_remove_ue(mod_id,rnti); - rrc_rlc_remove_ue(&ctxt); - pdcp_remove_UE(&ctxt); - } else { - MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); - F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = rnti; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; - itti_send_msg_to_task(TASK_CU_F1, mod_id, m); - } + if (!eNB_MAC->UE_free_ctrl[ue_num].raFlag) + rrc_mac_remove_ue(mod_id, rnti); + rrc_rlc_remove_ue(&ctxt); + pdcp_remove_UE(&ctxt); if(eNB_MAC->UE_free_ctrl[ue_num].removeContextFlg) { struct rrc_eNB_ue_context_s *ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti); @@ -1141,16 +1064,8 @@ rrc_eNB_generate_SecurityModeCommand( rrc_eNB_mui, DCCH); - if (!NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) { - LOG_I(RRC,"calling rrc_data_req :securityModeCommand\n"); - rrc_data_req(ctxt_pP, - DCCH, - rrc_eNB_mui++, - SDU_CONFIRM_NO, - size, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); - } + LOG_I(RRC, "calling rrc_data_req :securityModeCommand\n"); + rrc_data_req(ctxt_pP, DCCH, rrc_eNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL); } //----------------------------------------------------------------------------- @@ -1316,17 +1231,15 @@ rrc_eNB_generate_RRCConnectionReestablishment( LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = ue_context->primaryCC_id; - tmp.physicalConfigDedicated = ue_context->physicalConfigDedicated; - tmp.mac_MainConfig = ue_context->mac_MainConfig; - tmp.logicalChannelIdentity = 1; - tmp.logicalChannelConfig = SRB1_logicalChannelConfig; - tmp.measGapConfig = ue_context->measGapConfig; - rrc_mac_config_req_eNB(module_id, &tmp); - break; - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = ue_context->primaryCC_id; + tmp.physicalConfigDedicated = ue_context->physicalConfigDedicated; + tmp.mac_MainConfig = ue_context->mac_MainConfig; + tmp.logicalChannelIdentity = 1; + tmp.logicalChannelConfig = SRB1_logicalChannelConfig; + tmp.measGapConfig = ue_context->measGapConfig; + rrc_mac_config_req_eNB(module_id, &tmp); + break; } // if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) } // for (int cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) } // if (*SRB_configList != NULL) @@ -1891,15 +1804,13 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( ) //----------------------------------------------------------------------------- { - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rntiMaybeUEid); + int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rntiMaybeUEid); - if(UE_id != -1) { - RC.mac[ctxt_pP->module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; - RC.mac[ctxt_pP->module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer_thres = 20; - } else { - LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT " Generating LTE_RRCConnectionReestablishmentReject without UE_id(MAC) rnti %lx\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ctxt_pP->rntiMaybeUEid); - } + if(UE_id != -1) { + RC.mac[ctxt_pP->module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; + RC.mac[ctxt_pP->module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer_thres = 20; + } else { + LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT " Generating LTE_RRCConnectionReestablishmentReject without UE_id(MAC) rnti %lx\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ctxt_pP->rntiMaybeUEid); } T(T_ENB_RRC_CONNECTION_REESTABLISHMENT_REJECT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rntiMaybeUEid)); @@ -2003,23 +1914,13 @@ rrc_eNB_generate_RRCConnectionRelease( pthread_mutex_unlock(&rrc_release_freelist); - if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); - F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rntiMaybeUEid; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = buffer; - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = size; - itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); - } else { - rrc_data_req(ctxt_pP, - DCCH, - rrc_eNB_mui++, - SDU_CONFIRM_NO, - size, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); - } + rrc_data_req(ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); } uint8_t qci_to_priority[9]= {2,4,3,5,1,6,7,8,9}; @@ -2806,17 +2707,15 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t LOG_D(RRC, "Processing the DRX configuration in RRC Connection Reconfiguration\n"); /* Process the IE drx_Config */ - if (NODE_IS_MONOLITHIC(rrc_inst->node_type)) { - mac_MainConfig->drx_Config = do_DrxConfig(cc_id, &rrc_inst->configuration, UEcap); // drx_Config IE + mac_MainConfig->drx_Config = do_DrxConfig(cc_id, &rrc_inst->configuration, UEcap); // drx_Config IE - if (mac_MainConfig->drx_Config == NULL) { - LOG_W(RRC, "drx_Configuration parameter is NULL, cannot configure local UE parameters or CDRX is deactivated\n"); - } else { - /* Send DRX configuration to MAC task to configure timers of local UE context */ - rrc_mac_drx_config_req_t req = {.rnti = rnti, .drx_Configuration = mac_MainConfig->drx_Config}; - eNB_Config_Local_DRX(module_id, &req); - LOG_D(RRC, "DRX configured in MAC Main Configuration for RRC Connection Reconfiguration\n"); - } + if (mac_MainConfig->drx_Config == NULL) { + LOG_W(RRC, "drx_Configuration parameter is NULL, cannot configure local UE parameters or CDRX is deactivated\n"); + } else { + /* Send DRX configuration to MAC task to configure timers of local UE context */ + rrc_mac_drx_config_req_t req = {.rnti = rnti, .drx_Configuration = mac_MainConfig->drx_Config}; + eNB_Config_Local_DRX(module_id, &req); + LOG_D(RRC, "DRX configured in MAC Main Configuration for RRC Connection Reconfiguration\n"); } /* End of CDRX configuration */ @@ -3319,16 +3218,13 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t , NULL); /* Refresh SRBs/DRBs */ - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - *SRB_configList2, // NULL, - *DRB_configList, - NULL - , (LTE_PMCH_InfoList_r9_t *) NULL, - 0, - 0 - ); - } + rrc_rlc_config_asn1_req(ctxt_pP, + *SRB_configList2, // NULL, + *DRB_configList, + NULL, + (LTE_PMCH_InfoList_r9_t *)NULL, + 0, + 0); free(Sparams); Sparams = NULL; @@ -5213,16 +5109,13 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct , NULL); /* Refresh SRBs/DRBs */ - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - *SRB_configList2, // NULL, - *DRB_configList, - NULL - , (LTE_PMCH_InfoList_r9_t *) NULL, - 0, - 0 - ); - } + rrc_rlc_config_asn1_req(ctxt_pP, + *SRB_configList2, // NULL, + *DRB_configList, + NULL, + (LTE_PMCH_InfoList_r9_t *)NULL, + 0, + 0); free(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ); quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = NULL; @@ -5268,14 +5161,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc NULL, (LTE_PMCH_InfoList_r9_t *) NULL, NULL); - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - ue_context_p->ue_context.SRB_configList, - (LTE_DRB_ToAddModList_t *) NULL, - (LTE_DRB_ToReleaseList_t *) NULL, - (LTE_PMCH_InfoList_r9_t *) NULL, 0, 0 - ); - } + rrc_rlc_config_asn1_req(ctxt_pP, ue_context_p->ue_context.SRB_configList, (LTE_DRB_ToAddModList_t *)NULL, (LTE_DRB_ToReleaseList_t *)NULL, (LTE_PMCH_InfoList_r9_t *)NULL, 0, 0); if (EPC_MODE_ENABLED) { rrc_eNB_process_security ( @@ -5331,21 +5217,19 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( rnti_t rnti = ue_context_pP->ue_id_rnti; module_id_t module_id = ctxt_pP->module_id; - if (NODE_IS_MONOLITHIC(RC.rrc[module_id]->node_type)) { - int UE_id_mac = find_UE_id(module_id, rnti); + int UE_id_mac = find_UE_id(module_id, rnti); - if (UE_id_mac == -1) { - LOG_E(RRC, "Can't find UE_id(MAC) of UE rnti %x\n", rnti); - return; - } + if (UE_id_mac == -1) { + LOG_E(RRC, "Can't find UE_id(MAC) of UE rnti %x\n", rnti); + return; + } - UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[module_id]->UE_info.UE_sched_ctrl[UE_id_mac]); + UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[module_id]->UE_info.UE_sched_ctrl[UE_id_mac]); - if (UE_scheduling_control->cdrx_waiting_ack == true) { - UE_scheduling_control->cdrx_waiting_ack = false; - UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration is received - LOG_I(RRC, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n"); - } + if (UE_scheduling_control->cdrx_waiting_ack == true) { + UE_scheduling_control->cdrx_waiting_ack = false; + UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration is received + LOG_I(RRC, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n"); } /* End of CDRX processing */ @@ -5377,16 +5261,13 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( NULL); /* Refresh SRBs/DRBs */ - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - SRB_configList, // NULL, - DRB_configList, - DRB_Release_configList2, - (LTE_PMCH_InfoList_r9_t *) NULL, - 0, - 0 - ); - } + rrc_rlc_config_asn1_req(ctxt_pP, + SRB_configList, // NULL, + DRB_configList, + DRB_Release_configList2, + (LTE_PMCH_InfoList_r9_t *)NULL, + 0, + 0); /* Set the SRB active in UE context */ if (SRB_configList != NULL) { @@ -5474,17 +5355,15 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->logicalChannelIdentity; } - if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; - tmp.rnti = ue_context_pP->ue_context.rnti; - tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; - tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; - tmp.logicalChannelIdentity = DRB2LCHAN[i]; - tmp.logicalChannelConfig = DRB_configList->list.array[i]->logicalChannelConfig; - tmp.measGapConfig = ue_context_pP->ue_context.measGapConfig; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; + tmp.rnti = ue_context_pP->ue_context.rnti; + tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; + tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; + tmp.logicalChannelIdentity = DRB2LCHAN[i]; + tmp.logicalChannelConfig = DRB_configList->list.array[i]->logicalChannelConfig; + tmp.measGapConfig = ue_context_pP->ue_context.measGapConfig; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); } else { // remove LCHAN from MAC/PHY if (DRB_configList->list.array[i]->logicalChannelIdentity) { DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->logicalChannelIdentity; @@ -5493,15 +5372,13 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; - tmp.rnti = ue_context_pP->ue_context.rnti; - tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; - tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; - tmp.logicalChannelIdentity = DRB2LCHAN[i]; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; + tmp.rnti = ue_context_pP->ue_context.rnti; + tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; + tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; + tmp.logicalChannelIdentity = DRB2LCHAN[i]; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); } // end else of if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) } // end if (DRB_configList->list.array[i]) } // end for (int i = 0; i < DRB_configList->list.count; i++) @@ -5549,7 +5426,6 @@ rrc_eNB_generate_RRCConnectionSetup( LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig; //,*SRB2_logicalChannelConfig; LTE_SRB_ToAddModList_t **SRB_configList; LTE_SRB_ToAddMod_t *SRB1_config; - MessageDef *message_p; T(T_ENB_RRC_CONNECTION_SETUP, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rntiMaybeUEid)); eNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; SRB_configList = &ue_p->SRB_configList; @@ -5582,87 +5458,43 @@ rrc_eNB_generate_RRCConnectionSetup( "[MSG] RRC Connection Setup\n"); // configure SRB1/SRB2, PhysicalConfigDedicated, MAC_MainConfig for UE - switch (RC.rrc[ctxt_pP->module_id]->node_type) { - case ngran_eNB_CU : - case ngran_ng_eNB_CU : - case ngran_gNB_CU : - case ngran_gNB_CUCP : - // create an ITTI message - /* TODO: F1 IDs ar missing in RRC */ - message_p = itti_alloc_new_message (TASK_RRC_ENB, 0, F1AP_DL_RRC_MESSAGE); - F1AP_DL_RRC_MESSAGE (message_p).rrc_container = (uint8_t *)ue_p->Srb0.Tx_buffer.Payload; - F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = ue_p->Srb0.Tx_buffer.payload_size; - F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0; - F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0; - F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown - F1AP_DL_RRC_MESSAGE (message_p).rnti = ue_p->rnti; - F1AP_DL_RRC_MESSAGE (message_p).srb_id = CCCH; - F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1; - F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0; - itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p); - LOG_D(RRC, "Send F1AP_DL_RRC_MESSAGE with ITTI\n"); - break; - - case ngran_eNB_DU : - case ngran_gNB_DU : - // nothing to do for DU - AssertFatal(1==0,"nothing to do for DU\n"); - break; - - case ngran_eNB: - case ngran_ng_eNB : - case ngran_gNB : - if (*SRB_configList != NULL) { - for (int cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) { - if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) { - SRB1_config = (*SRB_configList)->list.array[cnt]; - - if (SRB1_config->logicalChannelConfig) { - if (SRB1_config->logicalChannelConfig->present == - LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { - SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } - - LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + if (*SRB_configList != NULL) { + for (int cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) { + if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) { + SRB1_config = (*SRB_configList)->list.array[cnt]; - if (RC.rrc[ctxt_pP->module_id]->node_type == ngran_eNB) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; - tmp.rnti = ue_context_pP->ue_context.rnti; - tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; - tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; - tmp.logicalChannelIdentity = 1; - tmp.logicalChannelConfig = SRB1_logicalChannelConfig; - tmp.measGapConfig = ue_context_pP->ue_context.measGapConfig; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - break; - } + if (SRB1_config->logicalChannelConfig) { + if (SRB1_config->logicalChannelConfig->present == LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { + SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; } + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; } + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT " RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = ue_context_pP->ue_context.primaryCC_id; + tmp.rnti = ue_context_pP->ue_context.rnti; + tmp.physicalConfigDedicated = ue_context_pP->ue_context.physicalConfigDedicated; + tmp.mac_MainConfig = ue_context_pP->ue_context.mac_MainConfig; + tmp.logicalChannelIdentity = 1; + tmp.logicalChannelConfig = SRB1_logicalChannelConfig; + tmp.measGapConfig = ue_context_pP->ue_context.measGapConfig; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); break; - - default : - LOG_W(RRC, "Unknown node type %d\n", RC.rrc[ctxt_pP->module_id]->node_type); } + } - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionSetup (bytes %d)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), - ue_p->Srb0.Tx_buffer.payload_size); - // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE - ue_context_pP->ue_context.ue_release_timer = 1; - // remove UE after 10 frames after RRCConnectionRelease is triggered - ue_context_pP->ue_context.ue_release_timer_thres = 1000; - /* init timers */ - ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0; + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT " [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionSetup (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_p->Srb0.Tx_buffer.payload_size); + // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE + ue_context_pP->ue_context.ue_release_timer = 1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres = 1000; + /* init timers */ + ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0; } } @@ -5777,19 +5609,6 @@ char openair_rrc_eNB_configuration( openair_rrc_on(&ctxt); - /* - RC.rrc[ctxt.module_id]->mcc= rrc_configuration_req->mcc; - RC.rrc[ctxt.module_id]->mnc= rrc_configuration_req->mnc; - RC.rrc[ctxt.module_id]->mnc_digit_length= rrc_configuration_req->mnc_digit_length; - RC.rrc[ctxt.module_id]->tac= rrc_configuration_req->tac; - - LOG_W(RRC, "[inst %d] RRC->MCC/MSG->MCC %d/%d \n", ctxt.module_id, RC.rrc[ctxt.module_id]->mcc, rrc_configuration_req->mcc); - */ - if (NODE_IS_CU(RC.rrc[ctxt.module_id]->node_type)) - // msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, F1AP_SCTP_REQ); - // RCconfig_CU_F1(msg_p, enb_id); - setup_ngran_CU(RC.rrc[ctxt.module_id]); - return 0; } @@ -6072,16 +5891,7 @@ rrc_eNB_decode_ccch( , (LTE_PMCH_InfoList_r9_t *) NULL ,NULL); - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - ue_context_p->ue_context.SRB_configList, - (LTE_DRB_ToAddModList_t *) NULL, - (LTE_DRB_ToReleaseList_t *) NULL - , (LTE_PMCH_InfoList_r9_t *) NULL, - 0,0 - ); - } - + rrc_rlc_config_asn1_req(ctxt_pP, ue_context_p->ue_context.SRB_configList, NULL, NULL, NULL, 0, 0); } break; @@ -6141,18 +5951,8 @@ rrc_eNB_decode_ccch( if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { LOG_I(RRC, " S-TMSI exists, ue_context_p %p, old rnti %x => %lx\n", ue_context_p, ue_context_p->ue_context.rnti, ctxt_pP->rntiMaybeUEid); - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - LOG_I(PHY, "remove RNTI %04x\n", ue_context_p->ue_context.rnti); - rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); - } else { - MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); - F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rntiMaybeUEid; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; - itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); - } + LOG_I(PHY, "remove RNTI %04x\n", ue_context_p->ue_context.rnti); + rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); stmsi_received=1; /* replace rnti in the context */ @@ -6226,17 +6026,7 @@ rrc_eNB_decode_ccch( PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), random_value); - if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) - rrc_mac_remove_ue(ctxt_pP->module_id, ctxt_pP->rntiMaybeUEid); - else if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); - F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rntiMaybeUEid; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; - F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; - F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; - itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); - } + rrc_mac_remove_ue(ctxt_pP->module_id, ctxt_pP->rntiMaybeUEid); return -1; } @@ -6277,14 +6067,7 @@ rrc_eNB_decode_ccch( NULL, (LTE_PMCH_InfoList_r9_t *) NULL,NULL); - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_asn1_req(ctxt_pP, - ue_context_p->ue_context.SRB_configList, - (LTE_DRB_ToAddModList_t *) NULL, - (LTE_DRB_ToReleaseList_t *) NULL, - (LTE_PMCH_InfoList_r9_t *) NULL, 0, 0 - ); - } + rrc_rlc_config_asn1_req(ctxt_pP, ue_context_p->ue_context.SRB_configList, NULL, NULL, NULL, 0, 0); break; @@ -6665,9 +6448,6 @@ rrc_eNB_decode_dcch( break; } - AssertFatal(!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type), - "CU cannot decode DCCH: no access to RC.mac[]\n"); - if(RC.mac[ctxt_pP->module_id]->UE_info.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag == 1) { LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld) C-RNTI Complete\n", @@ -6914,8 +6694,6 @@ rrc_eNB_decode_dcch( if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionSetupComplete.criticalExtensions.choice.c1. present == LTE_RRCConnectionSetupComplete__criticalExtensions__c1_PR_rrcConnectionSetupComplete_r8) { - AssertFatal(!NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type), - "should not be reached in DU\n"); rrc_eNB_process_RRCConnectionSetupComplete( ctxt_pP, ue_context_p, @@ -7312,112 +7090,6 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t *const ctxt_pP, rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0); } -void handle_f1_setup_req(f1ap_setup_req_t *f1_setup_req) { - LOG_I(RRC,"Received F1 Setup Request from gNB_DU %llu (%s)\n",(unsigned long long int)f1_setup_req->gNB_DU_id,f1_setup_req->gNB_DU_name); - //uint16_t num_cells_to_activate = 0; - int cu_cell_ind=0; - MessageDef *msg_p = NULL; - - //LOG_W(RRC,"num_cells_available %d \n", f1_setup_req->num_cells_available); - for (int i=0; i<f1_setup_req->num_cells_available; i++) { - // check that mcc/mnc match and grab MIB/SIB1 - int found_cell=0; - - for (int j=0; j<RC.nb_inst; j++) { - eNB_RRC_INST *rrc = RC.rrc[j]; - - if (rrc->configuration.mcc[0] == f1_setup_req->cell[i].mcc && - rrc->configuration.mnc[0] == f1_setup_req->cell[i].mnc && - rrc->nr_cellid == f1_setup_req->cell[i].nr_cellid) { - // check that CU rrc instance corresponds to mcc/mnc/cgi (normally cgi should be enough, but just in case) - rrc->carrier[0].MIB = malloc(f1_setup_req->mib_length[i]); - rrc->carrier[0].sizeof_MIB = f1_setup_req->mib_length[i]; - LOG_W(RRC, "instance %d mib length %d\n", i, f1_setup_req->mib_length[i]); - LOG_W(RRC, "instance %d sib1 length %d\n", i, f1_setup_req->sib1_length[i]); - memcpy((void *)rrc->carrier[0].MIB,f1_setup_req->mib[i],f1_setup_req->mib_length[i]); - asn_dec_rval_t dec_rval = uper_decode_complete(NULL, - &asn_DEF_LTE_BCCH_BCH_Message, - (void **)&rrc->carrier[0].mib_DU, - f1_setup_req->mib[i], - f1_setup_req->mib_length[i]); - AssertFatal(dec_rval.code == RC_OK, - "[eNB_DU %"PRIu8"] Failed to decode LTE_BCCH_BCH_MESSAGE (%zu bits)\n", - j, - dec_rval.consumed ); - LTE_BCCH_BCH_Message_t *mib = &rrc->carrier[0].mib; - LTE_BCCH_BCH_Message_t *mib_DU = rrc->carrier[0].mib_DU; - mib->message.dl_Bandwidth = mib_DU->message.dl_Bandwidth; - mib->message.phich_Config.phich_Resource = mib_DU->message.phich_Config.phich_Resource; - mib->message.phich_Config.phich_Duration = mib_DU->message.phich_Config.phich_Duration; - rrc->carrier[0].SIB1 = malloc(f1_setup_req->sib1_length[i]); - rrc->carrier[0].sizeof_SIB1 = f1_setup_req->sib1_length[i]; - memcpy((void *)rrc->carrier[0].SIB1,f1_setup_req->sib1[i],f1_setup_req->sib1_length[i]); - dec_rval = uper_decode_complete(NULL, - &asn_DEF_LTE_BCCH_DL_SCH_Message, - (void **)&rrc->carrier[0].siblock1_DU, - f1_setup_req->sib1[i], - f1_setup_req->sib1_length[i]); - AssertFatal(dec_rval.code == RC_OK, - "[eNB_DU %"PRIu8"] Failed to decode LTE_BCCH_DLSCH_MESSAGE (%zu bits)\n", - j, - dec_rval.consumed ); - // Parse message and extract SystemInformationBlockType1 field - LTE_BCCH_DL_SCH_Message_t *bcch_message = rrc->carrier[0].siblock1_DU; - AssertFatal(bcch_message->message.present == LTE_BCCH_DL_SCH_MessageType_PR_c1, - "bcch_message->message.present != LTE_BCCH_DL_SCH_MessageType_PR_c1\n"); - AssertFatal(bcch_message->message.choice.c1.present == LTE_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1, - "bcch_message->message.choice.c1.present != LTE_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1\n"); - rrc->carrier[0].sib1 = &bcch_message->message.choice.c1.choice.systemInformationBlockType1; - rrc->carrier[0].physCellId = f1_setup_req->cell[i].nr_pci; - // prepare F1_SETUP_RESPONSE - - if (msg_p == NULL) { - msg_p = itti_alloc_new_message (TASK_CU_F1, 0,F1AP_SETUP_RESP); - } - - F1AP_SETUP_RESP (msg_p).gNB_CU_name = rrc->node_name; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].mcc = rrc->configuration.mcc[0]; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].mnc = rrc->configuration.mnc[0]; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].mnc_digit_length = rrc->configuration.mnc_digit_length[0]; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].nr_cellid = rrc->nr_cellid; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].nrpci = f1_setup_req->cell[i].nr_pci; - int num_SI= 0; - if (rrc->carrier[0].SIB23) { - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].SI_container[2+num_SI] = rrc->carrier[0].SIB23; - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].SI_container_length[2+num_SI] = rrc->carrier[0].sizeof_SIB23; - //printf("SI %d size %d: ", 0, F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].SI_container_length[2+num_SI]); - //for (int n = 0; n < F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].SI_container_length[2+num_SI]; n++) - // printf("%02x ", F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].SI_container[2+num_SI][n]); - //printf("\n"); - num_SI++; - } - - F1AP_SETUP_RESP (msg_p).cells_to_activate[cu_cell_ind].num_SI = num_SI; - cu_cell_ind++; - found_cell=1; - F1AP_SETUP_RESP (msg_p).num_cells_to_activate = cu_cell_ind; - // send ITTI message to F1AP-CU task - itti_send_msg_to_task (TASK_CU_F1, ENB_MODULE_ID_TO_INSTANCE(j), msg_p); - break; - } else {// setup_req mcc/mnc match rrc internal list element - LOG_W(RRC,"[Inst %d] No matching MCC/MNC: rrc->mcc/f1_setup_req->mcc %d/%d rrc->mnc/f1_setup_req->mnc %d/%d \n", - j, rrc->configuration.mcc[0], f1_setup_req->cell[i].mcc,rrc->configuration.mnc[0], f1_setup_req->cell[i].mnc); - } - }// for (int j=0;j<RC.nb_inst;j++) - - if (found_cell==0) { - AssertFatal(1==0,"No cell found\n"); - /*msg_p = itti_alloc_new_message (TASK_CU_F1, 0,F1AP_SETUP_FAILURE); - F1AP_SETUP_RESP (msg_p).cause = rrc->node_name; - F1AP_SETUP_RESP (msg_p).time_to_wait = rrc->node_id; - F1AP_SETUP_RESP (msg_p).criticality_diagnostics = rrc->node_name;*/ - } - - // handle other failure cases - }//for (int i=0;i<f1_setup_req->num_cells_available;i++) -} - - // ignore 5GNR fields for now, just take MIB and SIB1 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -7665,7 +7337,7 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { ue_context_p->ue_context.rnti, ue_context_p->ue_context.ue_release_timer_thres_s1); - if (EPC_MODE_ENABLED && !NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) + if (EPC_MODE_ENABLED) rrc_eNB_generate_RRCConnectionRelease(ctxt_pP, ue_context_p); else removed_ue_count = add_ue_to_remove(ue_to_be_removed, removed_ue_count, ue_context_p); @@ -7719,7 +7391,7 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { ue_context_p->ue_context.ue_release_timer_rrc = 1; ue_context_p->ue_context.ue_release_timer_thres_rrc = 100; - if (EPC_MODE_ENABLED && !NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) { + if (EPC_MODE_ENABLED) { if (rrc_release_info.RRC_release_ctrl[release_num].flag == 4) { // if timer_s1 == 0 rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_CPLT(ctxt_pP->module_id, ue_context_p->ue_context.eNB_ue_s1ap_id); @@ -7744,7 +7416,7 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { if (rrc_ue_s1ap_ids != NULL) { rrc_eNB_S1AP_remove_ue_ids(RC.rrc[ctxt_pP->module_id], rrc_ue_s1ap_ids); } - } /* EPC_MODE_ENABLED && !NODE_IS_DU */ + } /* EPC_MODE_ENABLED */ rrc_release_info.RRC_release_ctrl[release_num].flag = 0; rrc_release_info.num_UEs--; @@ -7938,47 +7610,35 @@ void rrc_eNB_process_AdditionResponseInformation(const module_id_t enb_mod_idP, int size; ue_context = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], m->rnti); - if (ue_context) { - ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded; + if (ue_context == NULL) { + LOG_E(RRC, "no ue_context for RNTI %x\n", m->rnti); + return; + } - ue_context->ue_context.gnb_rnti = m->SgNB_ue_x2_id; - ue_context->ue_context.gnb_x2_assoc_id = m->gnb_x2_assoc_id; + ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded; + ue_context->ue_context.gnb_rnti = m->SgNB_ue_x2_id; + ue_context->ue_context.gnb_x2_assoc_id = m->gnb_x2_assoc_id; - int j=0; + int j = 0; - while(j < m->nb_e_rabs_admitted_tobeadded) { - for (int e_rab_idx=0; e_rab_idx<ue_context->ue_context.setup_e_rabs; e_rab_idx++) { - //Update ue_context information with gNB's address and new GTP tunnel ID - if( ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id) { - memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer, - m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer, - m->e_rabs_admitted_tobeadded[j].gnb_addr.length); - ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length; - ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid; - ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY; - break; - } + while (j < m->nb_e_rabs_admitted_tobeadded) { + for (int e_rab_idx = 0; e_rab_idx < ue_context->ue_context.setup_e_rabs; e_rab_idx++) { + // Update ue_context information with gNB's address and new GTP tunnel ID + if (ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id) { + memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer, m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer, m->e_rabs_admitted_tobeadded[j].gnb_addr.length); + ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length; + ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid; + ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY; + break; } - - j++; } - PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, - 0, - ENB_FLAG_YES, - m->rnti, - 0, 0); - size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf); - rrc_data_req(&ctxt, - DCCH, - rrc_eNB_mui++, - SDU_CONFIRM_NO, - size, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); - } else { - LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", m->rnti); + j++; } + + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, 0, ENB_FLAG_YES, m->rnti, 0, 0); + size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf); + rrc_data_req(&ctxt, DCCH, rrc_eNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL); } void rrc_eNB_process_ENDC_DC_prep_timeout(module_id_t module_id, x2ap_ENDC_dc_prep_timeout_t *m) @@ -8287,13 +7947,6 @@ void *rrc_enb_process_itti_msg(void *notUsed) { openair_rrc_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p)); break; - /* Messages from F1AP task */ - case F1AP_SETUP_REQ: - AssertFatal(NODE_IS_CU(RC.rrc[instance]->node_type), "should not receive F1AP_SETUP_REQUEST, need call by CU!\n"); - LOG_I(RRC, "[eNB %ld] Received %s : %p\n", instance, msg_name_p, &F1AP_SETUP_REQ(msg_p)); - handle_f1_setup_req(&F1AP_SETUP_REQ(msg_p)); - break; - case RRC_SUBFRAME_PROCESS: rrc_subframe_process(&RRC_SUBFRAME_PROCESS(msg_p).ctxt, RRC_SUBFRAME_PROCESS(msg_p).CC_id); break; diff --git a/openair2/RRC/LTE/rrc_eNB_M2AP.c b/openair2/RRC/LTE/rrc_eNB_M2AP.c index 550bb7c2bc1938e422c73e56de1abdf253d3250a..3b4818d534afcd1374e677b0db355fbe3de62265 100644 --- a/openair2/RRC/LTE/rrc_eNB_M2AP.c +++ b/openair2/RRC/LTE/rrc_eNB_M2AP.c @@ -276,15 +276,13 @@ static void rrc_M2AP_init_MBMS( , &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) ,NULL); - if (!NODE_IS_CU(RC.rrc[enb_mod_idP]->node_type)) { - rrc_rlc_config_asn1_req(&ctxt, - NULL, // LTE_SRB_ToAddModList - NULL, // LTE_DRB_ToAddModList - NULL, // DRB_ToReleaseList - &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) - ,0, 0 - ); - } + rrc_rlc_config_asn1_req(&ctxt, + NULL, // LTE_SRB_ToAddModList + NULL, // LTE_DRB_ToAddModList + NULL, // DRB_ToReleaseList + &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) + ,0, 0 + ); //rrc_mac_config_req(); } } @@ -298,8 +296,6 @@ static void rrc_M2AP_init_MCCH( ){ int sync_area = 0; - // initialize RRC_eNB_INST MCCH entry - eNB_RRC_INST *rrc = RC.rrc[enb_mod_idP]; RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE = malloc(RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area * sizeof(uint8_t *)); @@ -353,13 +349,11 @@ static void rrc_M2AP_init_MCCH( RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESS_COUNTING[sync_area].Active = 1; } - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.pmch_InfoList = &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9; - tmp.mbms_AreaConfiguration = RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message; - rrc_mac_config_req_eNB(enb_mod_idP, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.pmch_InfoList = &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9; + tmp.mbms_AreaConfiguration = RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message; + rrc_mac_config_req_eNB(enb_mod_idP, &tmp); return; } @@ -599,18 +593,16 @@ static uint8_t rrc_M2AP_do_SIB1_MBMS_SIB13( return(-1); } - carrier->MBMS_flag =1; - - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.rnti = 0xfffd; - tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; - tmp.MBMS_Flag = carrier->MBMS_flag; - tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; - tmp.FeMBMS_Flag = carrier->FeMBMS_flag; - rrc_mac_config_req_eNB(Mod_id, &tmp); - } + carrier->MBMS_flag = 1; + + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.rnti = 0xfffd; + tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; + tmp.MBMS_Flag = carrier->MBMS_flag; + tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; + tmp.FeMBMS_Flag = carrier->FeMBMS_flag; + rrc_mac_config_req_eNB(Mod_id, &tmp); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8); @@ -856,15 +848,13 @@ static uint8_t rrc_M2AP_do_SIB23_SIB2( return(-1); } - carrier->MBMS_flag =1; + carrier->MBMS_flag = 1; - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; - tmp.MBMS_Flag = carrier->MBMS_flag; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; + tmp.MBMS_Flag = carrier->MBMS_flag; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8); @@ -1001,13 +991,11 @@ static uint8_t rrc_M2AP_do_SIB23_SIB13( return(-1); } - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; - tmp.MBMS_Flag = carrier->MBMS_flag; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; + tmp.MBMS_Flag = carrier->MBMS_flag; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8); @@ -1250,16 +1238,14 @@ static uint8_t rrc_M2AP_do_SIB23_SIB2_SIB13( return(-1); } - carrier->MBMS_flag =1; + carrier->MBMS_flag = 1; - if (NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc_mac_config_req_eNB_t tmp = {0}; - tmp.CC_id = CC_id; - tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; - tmp.MBMS_Flag = carrier->MBMS_flag; - tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; - rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); - } + rrc_mac_config_req_eNB_t tmp = {0}; + tmp.CC_id = CC_id; + tmp.mbsfn_SubframeConfigList = carrier->sib2->mbsfn_SubframeConfigList; + tmp.MBMS_Flag = carrier->MBMS_flag; + tmp.mbsfn_AreaInfoList = &carrier->sib13->mbsfn_AreaInfoList_r9; + rrc_mac_config_req_eNB(ctxt_pP->module_id, &tmp); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8); diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index e2e8e56f4a8a590557e1cc7d560be17a1023dd04..fbc19d0a472393fc5b4123f40ce92d27cf3a8d94 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -993,39 +993,6 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char //if(ue_context_p->ue_context.reestablishment_cause == ReestablishmentCause_spare1){} rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(&ctxt,ue_context_p); } - - - if (NODE_IS_CU(RC.rrc[ctxt.module_id]->node_type)) { - struct eNB_RRC_INST_s *rrc= RC.rrc[0]; - MessageDef *message_p = itti_alloc_new_message (TASK_RRC_ENB, 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_p->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; - req->srbs_to_be_setup = malloc(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=CCCH; - req->drbs_to_be_setup_length = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_e_rabs; - req->drbs_to_be_setup = malloc(req->drbs_to_be_setup_length * sizeof(f1ap_drb_to_be_setup_t)); - f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup; - for (int i = 0; i < req->drbs_to_be_setup_length ; i++) { - DRBs[i].drb_id=S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].e_rab_id; - 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, 0, message_p); - } } return (0); diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c index 9452a1f1a9a39857e8a0e75ff8b5732e9d3941d6..0e56a5f57272ca4484d135559f7fd85a53b99017 100644 --- a/openair2/RRC/NR/L2_nr_interface.c +++ b/openair2/RRC/NR/L2_nr_interface.c @@ -28,7 +28,6 @@ * \email: raymond.knopp@eurecom.fr, kroempa@gmail.com */ -#include <f1ap_du_rrc_message_transfer.h> #include "platform_types.h" #include "nr_rrc_defs.h" #include "nr_rrc_extern.h" @@ -44,7 +43,6 @@ #include "NR_BCCH-BCH-Message.h" #include "rrc_gNB_UE_context.h" #include <openair2/RRC/NR/MESSAGES/asn1_msg.h> -#include <openair2/F1AP/f1ap_du_rrc_message_transfer.h> extern RAN_CONTEXT_t RC; @@ -101,7 +99,7 @@ nr_rrc_data_req( /* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads * Ideally, PDCP would not neet to be triggered like this but react to ITTI * messages automatically */ - if (ctxt_pP->enb_flag && NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) + if (ctxt_pP->enb_flag) pdcp_run(ctxt_pP); return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. diff --git a/openair3/COMMON/messages_types.h b/openair3/COMMON/messages_types.h index f8fd4642882ad5a8da84bd19c6513519b02edf71..1c16011af214ef52062d8fae752976d71f842fbd 100644 --- a/openair3/COMMON/messages_types.h +++ b/openair3/COMMON/messages_types.h @@ -31,7 +31,6 @@ #include "ip_forward_messages_types.h" #include "s11_messages_types.h" #include "s1ap_messages_types.h" -#include "f1ap_messages_types.h" #include "nas_messages_types.h" #include "s6a_messages_types.h" #include "sctp_messages_types.h" diff --git a/openair3/M3AP/m3ap_MCE_generate_messsages.c b/openair3/M3AP/m3ap_MCE_generate_messsages.c index 218fb965d3e5e51155871e48b7ab9a2ce097f593..0bedc0e4a230c14f417460a782141ff2fcc434fa 100644 --- a/openair3/M3AP/m3ap_MCE_generate_messsages.c +++ b/openair3/M3AP/m3ap_MCE_generate_messsages.c @@ -92,7 +92,7 @@ int m2ap_eNB_generate_m2_setup_request( //ie->id = M2AP_ProtocolIE_ID_id_gNB_eNB_ID; //ie->criticality = M2AP_Criticality_reject; //ie->value.present = M2AP_M2SetupRequestIEs__value_PR_GNB_eNB_ID; - //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, f1ap_du_data->gNB_eNB_id); + //asn_int642INTEGER(&ie->value.choice.GNB_eNB_ID, 0); //asn1cSeqAdd(&out->protocolIEs.list, ie); /* optional */ diff --git a/openair3/M3AP/m3ap_MCE_interface_management.c b/openair3/M3AP/m3ap_MCE_interface_management.c index f17513e7f8b38c823ccb26788d6e391d9f80e6aa..82fc044d3ed45e6c2562dc5440e03e8f87ecfb49 100644 --- a/openair3/M3AP/m3ap_MCE_interface_management.c +++ b/openair3/M3AP/m3ap_MCE_interface_management.c @@ -128,7 +128,7 @@ int MCE_send_MBMS_SESSION_START_RESPONSE(instance_t instance, m3ap_session_start ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStartResponse_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -137,7 +137,7 @@ int MCE_send_MBMS_SESSION_START_RESPONSE(instance_t instance, m3ap_session_start ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStartResponse_IEs__value_PR_MME_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -289,7 +289,7 @@ int MCE_send_MBMS_SESSION_STOP_RESPONSE(instance_t instance, m3ap_session_start_ ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStopResponse_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -298,7 +298,7 @@ int MCE_send_MBMS_SESSION_STOP_RESPONSE(instance_t instance, m3ap_session_start_ ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStopResponse_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -388,7 +388,7 @@ int MCE_send_MBMS_SESSION_UPDATE_RESPONSE(instance_t instance, m3ap_mbms_session ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionUpdateResponse_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -397,7 +397,7 @@ int MCE_send_MBMS_SESSION_UPDATE_RESPONSE(instance_t instance, m3ap_mbms_session ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionUpdateResponse_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -494,7 +494,7 @@ int MCE_send_M3_SETUP_REQUEST(m3ap_MCE_instance_t *instance_p, m3ap_MCE_data_t * // //ie->id = M3AP_ProtocolIE_ID_id_gNB_MCE_ID; // //ie->criticality = M3AP_Criticality_reject; // //ie->value.present = M3AP_M3SetupRequestIEs__value_PR_GNB_MCE_ID; -// //asn_int642INTEGER(&ie->value.choice.GNB_MCE_ID, f1ap_du_data->gNB_MCE_id); +// //asn_int642INTEGER(&ie->value.choice.GNB_MCE_ID, 0); // //asn1cSeqAdd(&out->protocolIEs.list, ie); // // /* optional */ diff --git a/openair3/M3AP/m3ap_MME.c b/openair3/M3AP/m3ap_MME.c index 4d73caff232568afa588f13fbacee92b29743a90..cb3b7f96db8b3be470b42b142ab5c862b78868e5 100644 --- a/openair3/M3AP/m3ap_MME.c +++ b/openair3/M3AP/m3ap_MME.c @@ -111,9 +111,7 @@ void m3ap_MME_handle_sctp_association_resp(instance_t instance, sctp_new_associa sctp_new_association_resp->ulp_cnx_id); if (sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN) - //proto_agent_stop(instance); - //f1ap_handle_setup_message(instance, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); - return; // exit -1 for debugging + return; } // go to an init func diff --git a/openair3/M3AP/m3ap_MME_interface_management.c b/openair3/M3AP/m3ap_MME_interface_management.c index 4b866fad2fb35e10bfcf1de11d3b4a1bfc7a8f01..2926261f0ec800dd81d638a1cb1e74e034edbcaf 100644 --- a/openair3/M3AP/m3ap_MME_interface_management.c +++ b/openair3/M3AP/m3ap_MME_interface_management.c @@ -93,7 +93,7 @@ int MME_send_MBMS_SESSION_START_REQUEST(instance_t instance/*, uint32_t assoc_id ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MME_MBMS_M3AP_ID; - //ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MME_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -343,7 +343,7 @@ int MME_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m3ap_session_stop_re ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStopRequest_IEs__value_PR_MME_MBMS_M3AP_ID; - //ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MME_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -352,7 +352,7 @@ int MME_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m3ap_session_stop_re ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionStopRequest_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); @@ -857,7 +857,7 @@ int MME_send_MBMS_SESSION_UPDATE_REQUEST(instance_t instance, m3ap_mbms_session_ ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MME_MBMS_M3AP_ID; - //ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MME_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); /* mandatory */ @@ -866,7 +866,7 @@ int MME_send_MBMS_SESSION_UPDATE_REQUEST(instance_t instance, m3ap_mbms_session_ ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID; ie->criticality = M3AP_Criticality_reject; ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MCE_MBMS_M3AP_ID; - //ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //? + //ie->value.choice.MCE_MBMS_M3AP_ID = 0; asn1cSeqAdd(&out->protocolIEs.list, ie); diff --git a/openair3/MME_APP/mme_app.c b/openair3/MME_APP/mme_app.c index 43a5df2ac8038b5829aefef0160036cc539eac67..61ec0641e3f15d0b996d60004f82efaecd3d1f83 100644 --- a/openair3/MME_APP/mme_app.c +++ b/openair3/MME_APP/mme_app.c @@ -85,17 +85,7 @@ extern RAN_CONTEXT_t RC; // LOG_I(ENB_APP,"[MCE %d] MCE_app_register via M3AP for instance %d\n", mce_id, ENB_MODULE_ID_TO_INSTANCE(mce_id)); // itti_send_msg_to_task (TASK_M3AP, ENB_MODULE_ID_TO_INSTANCE(mce_id), msg_p); // -// //if (NODE_IS_DU(node_type)) { // F1AP registration -// // // configure F1AP here for F1C -// // LOG_I(ENB_APP,"ngran_eNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n"); -// // msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, F1AP_SETUP_REQ); -// // RCconfig_DU_F1(msg_p, enb_id); -// -// // LOG_I(ENB_APP,"[eNB %d] eNB_app_register via F1AP for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); -// // itti_send_msg_to_task (TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); -// // // configure GTPu here for F1U -// //} -// //else { // S1AP registration +// //{ // S1AP registration // // /* note: there is an implicit relationship between the data structure and the message name */ // // msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, S1AP_REGISTER_ENB_REQ); // // RCconfig_S1(msg_p, enb_id); @@ -313,12 +303,9 @@ void *MME_app_task(void *args_p) { break; // case M3AP_SETUP_RESP: - // //AssertFatal(NODE_IS_DU(RC.rrc[0]->node_type), "Should not have received F1AP_REGISTER_ENB_CNF in CU/MCE\n"); // //LOG_I(MME_APP, "Received %s: associated ngran_MCE_CU %s with %d cells to activate\n", ITTI_MSG_NAME (msg_p), - // //F1AP_SETUP_RESP(msg_p).gNB_CU_name,F1AP_SETUP_RESP(msg_p).num_cells_to_activate); // - // //handle_f1ap_setup_resp(&F1AP_SETUP_RESP(msg_p)); // handle_m3ap_setup_resp(&M3AP_SETUP_RESP(msg_p)); // DevAssert(register_mce_pending > 0); diff --git a/openair3/MME_APP/mme_config.h b/openair3/MME_APP/mme_config.h index 6500404d63a5adfdb7268afbd486abe2d2262471..1afe619008bb7127684e2e4562a49dd4250ad714 100644 --- a/openair3/MME_APP/mme_config.h +++ b/openair3/MME_APP/mme_config.h @@ -40,7 +40,6 @@ #include "PHY/impl_defs_top.h" #include "PHY/defs_eNB.h" #include "s1ap_messages_types.h" -#include "f1ap_messages_types.h" #include "LTE_SystemInformationBlockType2.h" #include "rrc_messages_types.h" #include "RRC/LTE/rrc_defs.h"