Remove dependency from RRC gNB structure in NR RLC API

Pass a "type" of RLC operational mode, from which split-type/gNB/UE
decision is derived.

Co-authored-by: Robert Schmidt <robert.schmidt@openairinterface.org>
This commit is contained in:
francescomani
2025-04-24 18:40:07 +02:00
co-authored by Robert Schmidt
parent 3974136a05
commit 60a57c69b3
7 changed files with 30 additions and 16 deletions
+1 -1
View File
@@ -300,7 +300,7 @@ void init_openair0()
static void init_pdcp(int ue_id) 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"); LOG_I(RLC, "Problem at RLC initiation \n");
} }
nr_pdcp_layer_init(); nr_pdcp_layer_init();
+1 -1
View File
@@ -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)); 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"); AssertFatal(rc == 0, "Could not initialize RLC layer\n");
for (int j = 0; j < nb_inst; j++) { for (int j = 0; j < nb_inst; j++) {
+3 -1
View File
@@ -303,7 +303,9 @@ void mac_top_init_gNB(ngran_node_t node_type,
mac_rrc_init(RC.nrmac[i], node_type); mac_rrc_init(RC.nrmac[i], node_type);
}//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) }//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 // These should be out of here later
if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(); if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init();
+5 -7
View File
@@ -320,7 +320,7 @@ int nr_rlc_get_available_tx_space(const int ue_id, const logical_chan_id_t chann
return ret; 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 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static int inited = 0; static int inited = 0;
@@ -328,6 +328,7 @@ int nr_rlc_module_init(int gnb_flag)
if (pthread_mutex_lock(&lock)) abort(); if (pthread_mutex_lock(&lock)) abort();
bool gnb_flag = mode != NR_RLC_OP_MODE_UE;
if (gnb_flag == 1 && inited) { if (gnb_flag == 1 && inited) {
LOG_E(RLC, "%s:%d:%s: fatal, inited already 1\n", __FILE__, __LINE__, __FUNCTION__); LOG_E(RLC, "%s:%d:%s: fatal, inited already 1\n", __FILE__, __LINE__, __FUNCTION__);
exit(1); exit(1);
@@ -343,7 +344,7 @@ int nr_rlc_module_init(int gnb_flag)
if (gnb_flag == 0) if (gnb_flag == 0)
inited_ue = 1; 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(); if (pthread_mutex_unlock(&lock)) abort();
@@ -409,17 +410,14 @@ rb_found:
T_INT(0 /*ctxt_pP->module_id*/), T_INT(0 /*ctxt_pP->module_id*/),
T_INT(ue->ue_id), T_INT(rb_id), T_INT(size)); 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) { // if (NODE_IS_DU(type) && is_srb == 0) {
// LOG_D(RLC, "call proto_agent_send_pdcp_data_ind() \n"); // 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); // proto_agent_send_pdcp_data_ind(&ctx, is_srb, 0, rb_id, size, memblock);
// return; // 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) { if(is_srb) {
MessageDef *msg; MessageDef *msg;
msg = itti_alloc_new_message(TASK_RLC_ENB, 0, F1AP_UL_RRC_MESSAGE); msg = itti_alloc_new_message(TASK_RLC_ENB, 0, F1AP_UL_RRC_MESSAGE);
+1 -1
View File
@@ -41,7 +41,7 @@
struct NR_RLC_Config; struct NR_RLC_Config;
struct NR_LogicalChannelConfig; 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, void nr_mac_rlc_data_ind(const module_id_t module_idP,
const uint16_t ue_id, const uint16_t ue_id,
const bool gnb_flagP, const bool gnb_flagP,
+10 -4
View File
@@ -31,10 +31,10 @@ typedef struct {
pthread_mutex_t lock; pthread_mutex_t lock;
nr_rlc_ue_t **ue_list; nr_rlc_ue_t **ue_list;
int ue_count; int ue_count;
int gnb_flag; nr_rlc_op_mode_t mode;
} nr_rlc_ue_manager_internal_t; } 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; 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(); if (pthread_mutex_init(&ret->lock, NULL)) abort();
ret->gnb_flag = gnb_flag; ret->mode = mode;
return ret; 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) int nr_rlc_manager_get_gnb_flag(nr_rlc_ue_manager_t *_m)
{ {
nr_rlc_ue_manager_internal_t *m = _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) void nr_rlc_manager_lock(nr_rlc_ue_manager_t *_m)
+9 -1
View File
@@ -24,11 +24,18 @@
#include "common/platform_types.h" #include "common/platform_types.h"
#include "nr_rlc_entity.h" #include "nr_rlc_entity.h"
#include "common/platform_constants.h" #include "common/platform_constants.h"
#include "common/ngran_types.h"
typedef void nr_rlc_ue_manager_t; 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_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 { typedef struct nr_rlc_rb_t {
nr_rlc_rb_type type; nr_rlc_rb_type type;
union { union {
@@ -52,8 +59,9 @@ typedef struct nr_rlc_ue_t {
/* manager functions */ /* 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); int nr_rlc_manager_get_gnb_flag(nr_rlc_ue_manager_t *m);
void nr_rlc_manager_lock(nr_rlc_ue_manager_t *m); void nr_rlc_manager_lock(nr_rlc_ue_manager_t *m);