From 7606a93f57ec77b0472e98ecd95df364e6c41271 Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Tue, 7 Apr 2026 11:20:25 +0200 Subject: [PATCH] Refactor (RRC): validate neighbour-cell params and use gpd lookups Tighten neighbour-cell config parsing by enforcing parameter constraints in the descriptor and switching parsing code to name-based lookups with gpd. Changes: - Update `GNBNEIGHBOURCELLPARAMS_DESC` in `openair2/GNB_APP/gnb_paramdef.h` to add checks for `physical id`, `absoluteFrequencySSB`, `scs`, `band` `tracking_area_code`. - Remove neighbour-cell parameter index macros. - Refactor `parse_neighbour_cells_list` in `openair2/GNB_APP/gnb_config.c` to use `gpd()` lookups for neighbour fields instead of fixed indexes. - Extend `parse_neighbour_cells_list` with an `n_cell_params` argument and update `fill_neighbour_cell_configuration` to pass `sizeofArray(ncell_params)`. --- openair2/GNB_APP/gnb_config.c | 25 +++++++++++++--------- openair2/GNB_APP/gnb_paramdef.h | 38 +++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 213584a44d..0c38993487 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -2015,21 +2015,26 @@ static nr_neighbour_cell_t *get_neighbour_by_pci(seq_arr_t *neighbour_cells, int /** @brief Parse and add neighbour cells for a given cell configuration * @param[in,out] cell Neighbour cell configuration to populate * @param[in] list Parameter list describing neighbour cells - * @param[in] n_path Base path for neighbour configuration in the config tree */ -static void parse_neighbour_cells_list(neighbour_cell_configuration_t *cell, const paramlist_def_t *list, const char *n_path) + * @param[in] n_path Base path for neighbour configuration in the config tree + * @param[in] n_cell_params Number of neighbour-cell parameters */ +static void parse_neighbour_cells_list(neighbour_cell_configuration_t *cell, + const paramlist_def_t *list, + const char *n_path, + int n_cell_params) { seq_arr_init(&cell->neighbour_cells, sizeof(nr_neighbour_cell_t)); /* Parse each neighbour cell in the list */ for (int l = 0; l < list->numelt; ++l) { const paramdef_t *cell_params = list->paramarray[l]; - nr_neighbour_cell_t n = {.gNB_ID = *cell_params[GNB_CONFIG_N_CELL_GNB_ID_IDX].uptr, - .nrcell_id = (uint64_t)*cell_params[GNB_CONFIG_N_CELL_NR_CELLID_IDX].u64ptr, - .physicalCellId = *cell_params[GNB_CONFIG_N_CELL_PHYSICAL_ID_IDX].uptr, - .subcarrierSpacing = *cell_params[GNB_CONFIG_N_CELL_SCS_IDX].uptr, - .band = *cell_params[GNB_CONFIG_N_CELL_BAND_IDX].uptr, - .absoluteFrequencySSB = *cell_params[GNB_CONFIG_N_CELL_ABS_FREQ_SSB_IDX].i64ptr, - .tac = *cell_params[GNB_CONFIG_N_CELL_TAC_IDX].uptr}; + nr_neighbour_cell_t n = { + .gNB_ID = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_GNB_ID)->uptr, + .nrcell_id = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NRCELLID)->u64ptr, + .physicalCellId = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NEIGHBOUR_CELL_PHYSICAL_ID)->uptr, + .subcarrierSpacing = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NEIGHBOUR_CELL_SCS)->uptr, + .band = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NEIGHBOUR_CELL_BAND)->uptr, + .absoluteFrequencySSB = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NEIGHBOUR_CELL_ABS_FREQ_SSB)->i64ptr, + .tac = *gpd(cell_params, n_cell_params, GNB_CONFIG_STRING_NEIGHBOUR_TRACKING_ARE_CODE)->uptr}; char p[CONFIG_MAXOPTLENGTH]; // plmn path snprintf(p, sizeof(p), "%s.%s.[%i].%s", n_path, GNB_CONFIG_STRING_NEIGHBOUR_CELL_LIST, l, GNB_CONFIG_STRING_NEIGHBOUR_PLMN); @@ -2091,7 +2096,7 @@ static void fill_neighbour_cell_configuration(const uint8_t gnb_idx, gNB_RRC_INS GET_PARAMS_LIST(ncell_list, ncell_params, GNBNEIGHBOURCELLPARAMS_DESC, GNB_CONFIG_STRING_NEIGHBOUR_CELL_LIST, path); if (ncell_list.numelt < 1) continue; - parse_neighbour_cells_list(&cell, &ncell_list, path); + parse_neighbour_cells_list(&cell, &ncell_list, path, sizeofArray(ncell_params)); seq_arr_push_back(rrc->neighbour_cell_configuration, &cell, sizeof(cell)); } diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 05714771b4..50184503ea 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -300,23 +300,29 @@ typedef enum { #define GNB_CONFIG_STRING_NEIGHBOUR_TRACKING_ARE_CODE "tracking_area_code" #define GNB_CONFIG_STRING_NEIGHBOUR_PLMN "plmn" -#define GNB_CONFIG_N_CELL_GNB_ID_IDX 0 -#define GNB_CONFIG_N_CELL_NR_CELLID_IDX 1 -#define GNB_CONFIG_N_CELL_PHYSICAL_ID_IDX 2 -#define GNB_CONFIG_N_CELL_ABS_FREQ_SSB_IDX 3 -#define GNB_CONFIG_N_CELL_SCS_IDX 4 -#define GNB_CONFIG_N_CELL_BAND_IDX 5 -#define GNB_CONFIG_N_CELL_TAC_IDX 6 // clang-format off -#define GNBNEIGHBOURCELLPARAMS_DESC { \ -/* optname helpstr paramflags XXXptr def val type numelt */ \ - {GNB_CONFIG_STRING_GNB_ID, "neighbour cell's gNB ID", PARAMFLAG_MANDATORY, .uptr=NULL, .defintval=0, TYPE_UINT, 0}, \ - {GNB_CONFIG_STRING_NRCELLID, "neighbour cell nrCell Id", PARAMFLAG_MANDATORY, .u64ptr=NULL, .defint64val=0, TYPE_UINT64, 0}, \ - {GNB_CONFIG_STRING_NEIGHBOUR_CELL_PHYSICAL_ID, "neighbour cell physical id", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0}, \ - {GNB_CONFIG_STRING_NEIGHBOUR_CELL_ABS_FREQ_SSB, "neighbour cell abs freq ssb", PARAMFLAG_MANDATORY, .i64ptr=NULL, .defint64val=0, TYPE_INT64, 0}, \ - {GNB_CONFIG_STRING_NEIGHBOUR_CELL_SCS, "neighbour cell scs", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0}, \ - {GNB_CONFIG_STRING_NEIGHBOUR_CELL_BAND, "neighbour cell band", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=78, TYPE_UINT, 0}, \ - {GNB_CONFIG_STRING_NEIGHBOUR_TRACKING_ARE_CODE, "neighbour cell tracking area", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0}, \ +#define GNBNEIGHBOURCELLPARAMS_DESC { /* optname helpstr paramflags XXXptr def val type numelt */ \ + {GNB_CONFIG_STRING_GNB_ID, \ + "neighbour cell's gNB ID", PARAMFLAG_MANDATORY, .uptr=NULL, .defintval=0, TYPE_UINT, 0, \ + .chkPptr=NULL}, \ + {GNB_CONFIG_STRING_NRCELLID, \ + "neighbour cell nrCell Id", PARAMFLAG_MANDATORY, .u64ptr=NULL, .defint64val=0, TYPE_UINT64, 0, \ + .chkPptr=NULL}, \ + {GNB_CONFIG_STRING_NEIGHBOUR_CELL_PHYSICAL_ID, \ + "neighbour cell physical id", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0, \ + .chkPptr = &(checkedparam_t){.s2 = {config_check_uintrange, {0, 1007}}}}, \ + {GNB_CONFIG_STRING_NEIGHBOUR_CELL_ABS_FREQ_SSB, \ + "neighbour cell absolute frequency SSB (0..3279165)", PARAMFLAG_MANDATORY, .i64ptr=NULL, .defint64val=0, TYPE_INT64, 0, \ + .chkPptr = &(checkedparam_t){.s2 = {config_check_intrange, {0, 3279165}}}}, \ + {GNB_CONFIG_STRING_NEIGHBOUR_CELL_SCS, \ + "neighbour cell scs (15/30/60/120 kHz)", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0, \ + .chkPptr = &(checkedparam_t){.s1 = {config_check_intval, {0, 1, 2, 3}, 4}}}, \ + {GNB_CONFIG_STRING_NEIGHBOUR_CELL_BAND, \ + "neighbour cell band (1..1024)", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=78, TYPE_UINT, 0, \ + .chkPptr = &(checkedparam_t){.s2 = {config_check_uintrange, {1, 1024}}}}, \ + {GNB_CONFIG_STRING_NEIGHBOUR_TRACKING_ARE_CODE, \ + "neighbour cell tracking area (0..16777215)", PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0, TYPE_UINT, 0, \ + .chkPptr = &(checkedparam_t){.s2 = {config_check_uintrange, {0, 16777215}}}}, \ } // clang-format on