Refactor handover functions: get_neighbour_cell_information and get_neighbour_config

* differentiate the 2 functions based on the input: either NR Cell ID or PCI
* enhanced variables naming to distinguish the parameters
* add logging for debugging purposes
This commit is contained in:
Guido Casati
2025-06-09 20:12:12 +02:00
parent 75c7220345
commit d413cf9696
+43 -34
View File
@@ -96,6 +96,7 @@
#include "E1AP/lib/e1ap_interface_management.h" #include "E1AP/lib/e1ap_interface_management.h"
#include "NR_DL-DCCH-Message.h" #include "NR_DL-DCCH-Message.h"
#include "ds/byte_array.h" #include "ds/byte_array.h"
#include "alg/find.h"
#ifdef E2_AGENT #ifdef E2_AGENT
#include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h" #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
@@ -130,39 +131,47 @@ static void freeDRBlist(NR_DRB_ToAddModList_t *list)
return; return;
} }
const neighbour_cell_configuration_t *get_neighbour_config(int serving_cell_nr_cellid) static bool eq_cell_id(const void *vval, const void *vit)
{ {
const gNB_RRC_INST *rrc = RC.nrrrc[0]; const int *cell_id = (const int *)vval;
seq_arr_t *neighbour_cell_configuration = rrc->neighbour_cell_configuration; const neighbour_cell_configuration_t *cell = (const neighbour_cell_configuration_t *)vit;
if (!neighbour_cell_configuration) return cell->nr_cell_id == *cell_id;
return NULL; }
for (int cellIdx = 0; cellIdx < neighbour_cell_configuration->size; cellIdx++) { const neighbour_cell_configuration_t *get_neighbour_cell_config(const gNB_RRC_INST *rrc, int cell_id)
neighbour_cell_configuration_t *neighbour_config = {
(neighbour_cell_configuration_t *)seq_arr_at(neighbour_cell_configuration, cellIdx); if (!rrc->neighbour_cell_configuration)
if (neighbour_config->nr_cell_id == serving_cell_nr_cellid) return NULL;
return neighbour_config; seq_arr_t *head = rrc->neighbour_cell_configuration;
LOG_D(NR_RRC, "Number of neighbour cell configurations: %ld\n", head->size);
elm_arr_t e = find_if(head, &cell_id, eq_cell_id);
if (e.found) {
const neighbour_cell_configuration_t *cell = (const neighbour_cell_configuration_t *)e.it;
LOG_D(NR_RRC, "Found matching neighbour cell with Cell ID %ld\n", cell->nr_cell_id);
return cell;
} }
return NULL; return NULL;
} }
const nr_neighbour_gnb_configuration_t *get_neighbour_cell_information(int serving_cell_nr_cellid, int neighbour_cell_phy_id) static bool eq_pci(const void *vval, const void *vit)
{ {
const gNB_RRC_INST *rrc = RC.nrrrc[0]; const int *pci = (const int *)vval;
seq_arr_t *neighbour_cell_configuration = rrc->neighbour_cell_configuration; const nr_neighbour_gnb_configuration_t *neighbour = (const nr_neighbour_gnb_configuration_t *)vit;
for (int cellIdx = 0; cellIdx < neighbour_cell_configuration->size; cellIdx++) { return neighbour->physicalCellId == *pci;
neighbour_cell_configuration_t *neighbour_config = }
(neighbour_cell_configuration_t *)seq_arr_at(neighbour_cell_configuration, cellIdx);
if (!neighbour_config)
continue;
for (int neighbourIdx = 0; neighbourIdx < neighbour_config->neighbour_cells->size; neighbourIdx++) { const nr_neighbour_gnb_configuration_t *get_neighbour_gnb_by_pci(const neighbour_cell_configuration_t *cell, int pci)
nr_neighbour_gnb_configuration_t *neighbour = {
(nr_neighbour_gnb_configuration_t *)seq_arr_at(neighbour_config->neighbour_cells, neighbourIdx); seq_arr_t *head = cell->neighbour_cells;
if (neighbour != NULL && neighbour->physicalCellId == neighbour_cell_phy_id) DevAssert(head != NULL);
return neighbour; LOG_D(NR_RRC, "Number of neighbour cells: %ld\n", head->size);
} elm_arr_t e = find_if(head, &pci, eq_pci);
if (e.found) {
const nr_neighbour_gnb_configuration_t *neighbour = (const nr_neighbour_gnb_configuration_t *)e.it;
LOG_D(NR_RRC, "Found matching neighbour cell with PCI %d and Cell ID %ld\n", neighbour->physicalCellId, neighbour->nrcell_id);
return neighbour;
} }
LOG_E(NR_RRC, "No matching neighbour cell found for Physical Cell ID: %d\n", pci);
return NULL; return NULL;
} }
@@ -564,7 +573,7 @@ static int rrc_gNB_encode_RRCReconfiguration(gNB_RRC_INST *rrc,
int band = get_dl_band(cell_info); int band = get_dl_band(cell_info);
const NR_MeasTimingList_t *mtlist = du->mtc->criticalExtensions.choice.c1->choice.measTimingConf->measTiming; const NR_MeasTimingList_t *mtlist = du->mtc->criticalExtensions.choice.c1->choice.measTimingConf->measTiming;
const NR_MeasTiming_t *mt = mtlist->list.array[0]; const NR_MeasTiming_t *mt = mtlist->list.array[0];
const neighbour_cell_configuration_t *neighbour_config = get_neighbour_config(cell_info->nr_cellid); const neighbour_cell_configuration_t *neighbour_config = get_neighbour_cell_config(rrc, cell_info->nr_cellid);
seq_arr_t *neighbour_cells = NULL; seq_arr_t *neighbour_cells = NULL;
if (neighbour_config) if (neighbour_config)
neighbour_cells = neighbour_config->neighbour_cells; neighbour_cells = neighbour_config->neighbour_cells;
@@ -1391,7 +1400,7 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_INST *rrc,
int servingCellRSRP = 0; int servingCellRSRP = 0;
int neighbourCellRSRP = 0; int neighbourCellRSRP = 0;
int servingCellId = -1; int scell_pci = -1;
switch (event_triggered->eventId.present) { switch (event_triggered->eventId.present) {
case NR_EventTriggerConfig__eventId_PR_eventA2: case NR_EventTriggerConfig__eventId_PR_eventA2:
@@ -1408,7 +1417,7 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_INST *rrc,
for (int serving_cell_idx = 0; serving_cell_idx < measResults->measResultServingMOList.list.count; serving_cell_idx++) { for (int serving_cell_idx = 0; serving_cell_idx < measResults->measResultServingMOList.list.count; serving_cell_idx++) {
const NR_MeasResultServMO_t *meas_result_serv_MO = measResults->measResultServingMOList.list.array[serving_cell_idx]; const NR_MeasResultServMO_t *meas_result_serv_MO = measResults->measResultServingMOList.list.array[serving_cell_idx];
servingCellId = *(meas_result_serv_MO->measResultServingCell.physCellId); scell_pci = *(meas_result_serv_MO->measResultServingCell.physCellId);
if (meas_result_serv_MO->measResultServingCell.measResult.cellResults.resultsSSB_Cell) { if (meas_result_serv_MO->measResultServingCell.measResult.cellResults.resultsSSB_Cell) {
servingCellRSRP = *(meas_result_serv_MO->measResultServingCell.measResult.cellResults.resultsSSB_Cell->rsrp) - 157; servingCellRSRP = *(meas_result_serv_MO->measResultServingCell.measResult.cellResults.resultsSSB_Cell->rsrp) - 157;
} else { } else {
@@ -1426,7 +1435,7 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_INST *rrc,
const NR_MeasResultListNR_t *measResultListNR = measResults->measResultNeighCells->choice.measResultListNR; const NR_MeasResultListNR_t *measResultListNR = measResults->measResultNeighCells->choice.measResultListNR;
for (int neigh_meas_idx = 0; neigh_meas_idx < measResultListNR->list.count; neigh_meas_idx++) { for (int neigh_meas_idx = 0; neigh_meas_idx < measResultListNR->list.count; neigh_meas_idx++) {
const NR_MeasResultNR_t *meas_result_neigh_cell = (measResultListNR->list.array[neigh_meas_idx]); const NR_MeasResultNR_t *meas_result_neigh_cell = (measResultListNR->list.array[neigh_meas_idx]);
const int neighbourCellId = *(meas_result_neigh_cell->physCellId); const int neighbour_pci = *(meas_result_neigh_cell->physCellId);
// TS 138 133 Table 10.1.6.1-1: SS-RSRP and CSI-RSRP measurement report mapping // TS 138 133 Table 10.1.6.1-1: SS-RSRP and CSI-RSRP measurement report mapping
const struct NR_MeasResultNR__measResult__cellResults *cellResults = &(meas_result_neigh_cell->measResult.cellResults); const struct NR_MeasResultNR__measResult__cellResults *cellResults = &(meas_result_neigh_cell->measResult.cellResults);
@@ -1439,13 +1448,13 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_INST *rrc,
LOG_I(NR_RRC, LOG_I(NR_RRC,
"HO LOG: Measurement Report for the neighbour %d with RSRP: %d\n", "HO LOG: Measurement Report for the neighbour %d with RSRP: %d\n",
neighbourCellId, neighbour_pci,
neighbourCellRSRP); neighbourCellRSRP);
const f1ap_served_cell_info_t *neigh_cell = get_cell_information_by_phycellId(neighbourCellId); const f1ap_served_cell_info_t *neigh_cell = get_cell_information_by_phycellId(neighbour_pci);
const f1ap_served_cell_info_t *serving_cell = get_cell_information_by_phycellId(servingCellId); const f1ap_served_cell_info_t *serving_cell = get_cell_information_by_phycellId(scell_pci);
const nr_neighbour_gnb_configuration_t *neighbour = const neighbour_cell_configuration_t *cell = get_neighbour_cell_config(rrc, serving_cell->nr_cellid);
get_neighbour_cell_information(serving_cell->nr_cellid, neighbourCellId); const nr_neighbour_gnb_configuration_t *neighbour = get_neighbour_gnb_by_pci(cell, neighbour_pci);
// CU does not have f1 connection with neighbour cell context. So check does serving cell has this phyCellId as a // CU does not have f1 connection with neighbour cell context. So check does serving cell has this phyCellId as a
// neighbour. // neighbour.
if (!neigh_cell && neighbour) { if (!neigh_cell && neighbour) {
@@ -1465,7 +1474,7 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_INST *rrc,
nr_rrc_du_container_t *target_du = get_du_by_cell_id(rrc, neigh_cell->nr_cellid); nr_rrc_du_container_t *target_du = get_du_by_cell_id(rrc, neigh_cell->nr_cellid);
nr_rrc_trigger_f1_ho(rrc, ue, source_du, target_du); nr_rrc_trigger_f1_ho(rrc, ue, source_du, target_du);
} else { } else {
LOG_W(NR_RRC, "UE %d: received A3 event for stronger neighbor PCI %d, but no such neighbour in configuration\n", ue->rrc_ue_id, neighbourCellId); LOG_W(NR_RRC, "UE %d: received A3 event for stronger neighbor PCI %d, but no such neighbour in configuration\n", ue->rrc_ue_id, neighbour_pci);
} }
} }