Commit 46c1aff4 authored by Cedric Roux's avatar Cedric Roux

fix: do NR only if at least one gNB is connected to the eNB

We used to set 'does_nr' of an UE if we detect ENDC supported in the
UE capabilities.

Then we activate NR measurements if 'does_nr' is true.

The problem is that if the eNB is not connected to a gNB but the UE
reports some NR measurements (because a gNB is running somewhere near)
then the eNB will crash when starting the switch to NR.

A (quick) solution is to set 'does_nr' only if there is a gNB connected to
the eNB.

Maybe not the best solution. To be changed if needed.
parent 1f3513b1
...@@ -67,6 +67,8 @@ ...@@ -67,6 +67,8 @@
#define MAX_NUM_NEIGH_CELLs 6 /* maximum neighbouring cells number */ #define MAX_NUM_NEIGH_CELLs 6 /* maximum neighbouring cells number */
#define MAX_NUM_GNB_CELLs 1 /* maximum gNB cells number */
#define UE_STATE_NOTIFICATION_INTERVAL 50 #define UE_STATE_NOTIFICATION_INTERVAL 50
#define IPV4_ADDR "%u.%u.%u.%u" #define IPV4_ADDR "%u.%u.%u.%u"
...@@ -804,8 +806,13 @@ typedef struct eNB_RRC_INST_s { ...@@ -804,8 +806,13 @@ typedef struct eNB_RRC_INST_s {
int num_neigh_cells_cc[MAX_NUM_CCs]; int num_neigh_cells_cc[MAX_NUM_CCs];
uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs]; uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
// gNB cells connected to this eNB
int num_gnb_cells;
int num_gnb_cells_cc[MAX_NUM_GNB_CELLs];
uint32_t gnb_cells_id[MAX_NUM_GNB_CELLs][MAX_NUM_CCs];
// Nr scc freq band and SSB absolute frequency // Nr scc freq band and SSB absolute frequency
uint32_t nr_neigh_freq_band[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs]; uint32_t nr_gnb_freq_band[MAX_NUM_GNB_CELLs][MAX_NUM_CCs];
int nr_scg_ssb_freq; int nr_scg_ssb_freq;
// other RAN parameters // other RAN parameters
......
...@@ -1283,7 +1283,7 @@ rrc_eNB_generate_UECapabilityEnquiry( ...@@ -1283,7 +1283,7 @@ rrc_eNB_generate_UECapabilityEnquiry(
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0]; int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0]; uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_gnb_freq_band[0][0];
size = do_UECapabilityEnquiry( size = do_UECapabilityEnquiry(
ctxt_pP, ctxt_pP,
buffer, buffer,
...@@ -1333,7 +1333,7 @@ rrc_eNB_generate_NR_UECapabilityEnquiry( ...@@ -1333,7 +1333,7 @@ rrc_eNB_generate_NR_UECapabilityEnquiry(
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0]; int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0]; uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_gnb_freq_band[0][0];
size = do_NR_UECapabilityEnquiry( size = do_NR_UECapabilityEnquiry(
ctxt_pP, ctxt_pP,
buffer, buffer,
...@@ -7588,8 +7588,8 @@ is_en_dc_supported( ...@@ -7588,8 +7588,8 @@ is_en_dc_supported(
) )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
/* to be refined - check that the eNB is connected to a gNB, check that /* to be refined - check that the bands supported by the UE include
* the bands supported by the UE include the band of the gNB * the band of the gNB
*/ */
#define NCE nonCriticalExtension #define NCE nonCriticalExtension
return c != NULL return c != NULL
...@@ -8289,8 +8289,13 @@ rrc_eNB_decode_dcch( ...@@ -8289,8 +8289,13 @@ rrc_eNB_decode_dcch(
ue_context_p->ue_context.UE_Capability = 0; ue_context_p->ue_context.UE_Capability = 0;
} }
if (dec_rval.code == RC_OK) if (dec_rval.code == RC_OK) {
ue_context_p->ue_context.does_nr = is_en_dc_supported(ue_context_p->ue_context.UE_Capability); /* do NR only if at least one gNB connected */
if (RC.rrc[ctxt_pP->module_id]->num_gnb_cells != 0)
ue_context_p->ue_context.does_nr = is_en_dc_supported(ue_context_p->ue_context.UE_Capability);
else
ue_context_p->ue_context.does_nr = 0;
}
if (EPC_MODE_ENABLED) { if (EPC_MODE_ENABLED) {
rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP, rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP,
...@@ -9029,22 +9034,22 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { ...@@ -9029,22 +9034,22 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
} }
void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) { void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) {
if (RC.rrc[mod_id]->num_neigh_cells > MAX_NUM_NEIGH_CELLs) { if (RC.rrc[mod_id]->num_gnb_cells >= MAX_NUM_GNB_CELLs) {
LOG_E(RRC, "Error: number of neighbouring cells is exceeded \n"); LOG_E(RRC, "Error: number of gNB cells is exceeded\n");
return; return;
} }
if (m->num_cc > MAX_NUM_CCs) { if (m->num_cc > MAX_NUM_CCs) {
LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n"); LOG_E(RRC, "Error: number of gNB cells carriers is exceeded \n");
return; return;
} }
RC.rrc[mod_id]->num_neigh_cells++; RC.rrc[mod_id]->num_gnb_cells++;
RC.rrc[mod_id]->num_neigh_cells_cc[RC.rrc[mod_id]->num_neigh_cells-1] = m->num_cc; RC.rrc[mod_id]->num_gnb_cells_cc[RC.rrc[mod_id]->num_gnb_cells-1] = m->num_cc;
for (int i=0; i<m->num_cc; i++) { for (int i=0; i<m->num_cc; i++) {
RC.rrc[mod_id]->neigh_cells_id[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->Nid_cell[i]; RC.rrc[mod_id]->gnb_cells_id[RC.rrc[mod_id]->num_gnb_cells-1][i] = m->Nid_cell[i];
RC.rrc[mod_id]->nr_neigh_freq_band[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->servedNrCell_band[i]; RC.rrc[mod_id]->nr_gnb_freq_band[RC.rrc[mod_id]->num_gnb_cells-1][i] = m->servedNrCell_band[i];
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment