diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 7494d7d06b..d6d9582336 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -300,7 +300,7 @@ void init_openair0() static void init_pdcp(int ue_id) { - if (get_softmodem_params()->nsa && nr_rlc_module_init(0) != 0) { + if (get_softmodem_params()->nsa && nr_rlc_module_init(NR_RLC_OP_MODE_UE) != 0) { LOG_I(RLC, "Problem at RLC initiation \n"); } nr_pdcp_layer_init(); diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 1ca4168b6f..6a6c7633bf 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -141,7 +141,7 @@ NR_UE_MAC_INST_t *nr_l2_init_ue(int nb_inst) ue_init_config_request(mac, get_slots_per_frame_from_scs(get_softmodem_params()->numerology)); } - int rc = nr_rlc_module_init(0); + int rc = nr_rlc_module_init(NR_RLC_OP_MODE_UE); AssertFatal(rc == 0, "Could not initialize RLC layer\n"); for (int j = 0; j < nb_inst; j++) { diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index acf0658e4c..2331e25cfd 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -303,7 +303,9 @@ void mac_top_init_gNB(ngran_node_t node_type, mac_rrc_init(RC.nrmac[i], node_type); }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) - AssertFatal(nr_rlc_module_init(1) == 0,"Could not initialize RLC layer\n"); + nr_rlc_op_mode_t mode = NODE_IS_MONOLITHIC(node_type) ? NR_RLC_OP_MODE_MONO_GNB : NR_RLC_OP_MODE_SPLIT_GNB; + int success = nr_rlc_module_init(mode); + AssertFatal(success == 0,"Could not initialize RLC layer\n"); // These should be out of here later if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(); diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index b48b03847f..94079dada8 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -320,7 +320,7 @@ int nr_rlc_get_available_tx_space(const int ue_id, const logical_chan_id_t chann return ret; } -int nr_rlc_module_init(int gnb_flag) +int nr_rlc_module_init(nr_rlc_op_mode_t mode) { static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; static int inited = 0; @@ -328,6 +328,7 @@ int nr_rlc_module_init(int gnb_flag) if (pthread_mutex_lock(&lock)) abort(); + bool gnb_flag = mode != NR_RLC_OP_MODE_UE; if (gnb_flag == 1 && inited) { LOG_E(RLC, "%s:%d:%s: fatal, inited already 1\n", __FILE__, __LINE__, __FUNCTION__); exit(1); @@ -343,7 +344,7 @@ int nr_rlc_module_init(int gnb_flag) if (gnb_flag == 0) inited_ue = 1; - nr_rlc_ue_manager = new_nr_rlc_ue_manager(gnb_flag); + nr_rlc_ue_manager = new_nr_rlc_ue_manager(mode); if (pthread_mutex_unlock(&lock)) abort(); @@ -409,17 +410,14 @@ rb_found: T_INT(0 /*ctxt_pP->module_id*/), T_INT(ue->ue_id), T_INT(rb_id), T_INT(size)); - const ngran_node_t type = RC.nrrrc[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) && is_srb == 0) { // LOG_D(RLC, "call proto_agent_send_pdcp_data_ind() \n"); // proto_agent_send_pdcp_data_ind(&ctx, is_srb, 0, rb_id, size, memblock); // return; // } - if (NODE_IS_DU(type)) { + bool rlc_split = nr_rlc_manager_rlc_is_split(nr_rlc_ue_manager); + if (rlc_split) { if(is_srb) { MessageDef *msg; msg = itti_alloc_new_message(TASK_RLC_ENB, 0, F1AP_UL_RRC_MESSAGE); diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h index 700a29d702..5a56016643 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h @@ -41,7 +41,7 @@ struct NR_RLC_Config; struct NR_LogicalChannelConfig; -int nr_rlc_module_init(int gnb_flag); +int nr_rlc_module_init(nr_rlc_op_mode_t mode); void nr_mac_rlc_data_ind(const module_id_t module_idP, const uint16_t ue_id, const bool gnb_flagP, diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.c b/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.c index 52e0f6a6b8..5b7563135e 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.c @@ -31,10 +31,10 @@ typedef struct { pthread_mutex_t lock; nr_rlc_ue_t **ue_list; int ue_count; - int gnb_flag; + nr_rlc_op_mode_t mode; } nr_rlc_ue_manager_internal_t; -nr_rlc_ue_manager_t *new_nr_rlc_ue_manager(int gnb_flag) +nr_rlc_ue_manager_t *new_nr_rlc_ue_manager(nr_rlc_op_mode_t mode) { nr_rlc_ue_manager_internal_t *ret; @@ -45,15 +45,21 @@ nr_rlc_ue_manager_t *new_nr_rlc_ue_manager(int gnb_flag) } if (pthread_mutex_init(&ret->lock, NULL)) abort(); - ret->gnb_flag = gnb_flag; + ret->mode = mode; return ret; } +bool nr_rlc_manager_rlc_is_split(nr_rlc_ue_manager_t *_m) +{ + nr_rlc_ue_manager_internal_t *m = _m; + return m->mode == NR_RLC_OP_MODE_SPLIT_GNB; +} + int nr_rlc_manager_get_gnb_flag(nr_rlc_ue_manager_t *_m) { nr_rlc_ue_manager_internal_t *m = _m; - return m->gnb_flag; + return m->mode != NR_RLC_OP_MODE_UE; } void nr_rlc_manager_lock(nr_rlc_ue_manager_t *_m) diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h b/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h index 799d7afca8..3dec237958 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h @@ -24,11 +24,18 @@ #include "common/platform_types.h" #include "nr_rlc_entity.h" #include "common/platform_constants.h" +#include "common/ngran_types.h" typedef void nr_rlc_ue_manager_t; typedef enum nr_rlc_rb_type { NR_RLC_NONE = 0, NR_RLC_SRB = 1, NR_RLC_DRB = 2 } nr_rlc_rb_type; +typedef enum { + NR_RLC_OP_MODE_SPLIT_GNB, + NR_RLC_OP_MODE_MONO_GNB, + NR_RLC_OP_MODE_UE, +} nr_rlc_op_mode_t; + typedef struct nr_rlc_rb_t { nr_rlc_rb_type type; union { @@ -52,8 +59,9 @@ typedef struct nr_rlc_ue_t { /* manager functions */ /***********************************************************************/ -nr_rlc_ue_manager_t *new_nr_rlc_ue_manager(int gnb_flag); +nr_rlc_ue_manager_t *new_nr_rlc_ue_manager(nr_rlc_op_mode_t mode); +bool nr_rlc_manager_rlc_is_split(nr_rlc_ue_manager_t *_m); int nr_rlc_manager_get_gnb_flag(nr_rlc_ue_manager_t *m); void nr_rlc_manager_lock(nr_rlc_ue_manager_t *m);