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)`.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user