From e57acf61905145c33f3fa5e7ff6eb6e8c24a744b Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Thu, 17 Oct 2024 12:43:36 +0200 Subject: [PATCH] Refactor RCconfig_NR_L1 * removed initialization of gNB * separate function to get blacklisted UL PRBs * call the getter in both L1 and MAC/RLC configuration * other minor improvements --- openair1/PHY/defs_gNB.h | 2 +- openair2/GNB_APP/gnb_config.c | 250 ++++++++++++++++------------------ 2 files changed, 119 insertions(+), 133 deletions(-) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index da316de8aa..7022ad8b23 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -514,7 +514,7 @@ typedef struct PHY_VARS_gNB_s { int srs_thres; uint64_t bad_pucch; int num_ulprbbl; - int ulprbbl[275]; + uint16_t ulprbbl [MAX_BWP_SIZE]; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 08e4d97a31..bb85afc429 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -834,135 +834,133 @@ void RCconfig_nr_prs(void) } } +#define ALL_SYMBOLS_TAKEN 0x3FFF + +/** + * @brief Get number or blacklisted UL PRBs and their mapping from gNB config + */ +static int get_prb_blacklist(uint8_t instance, uint16_t *prbbl) +{ + paramdef_t GNBSParams[] = GNBSPARAMS_DESC; + paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST, NULL, 0}; + config_get(config_get_if(), GNBSParams, sizeofArray(GNBSParams), NULL); + int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; + AssertFatal(num_gnbs > 0, "Failed to parse config file, no GNBs found in field %s \n", GNB_CONFIG_STRING_ACTIVE_GNBS); + paramdef_t GNBParams[] = GNBPARAMS_DESC; + config_getlist(config_get_if(), &GNBParamList, GNBParams, sizeofArray(GNBParams), NULL); + + int num_prbbl = 0; + char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; + + if (!ulprbbl) + return -1; + + LOG_D(NR_PHY, "PRB blacklist found: %s\n", ulprbbl); + char *save = NULL; + char *pt = strtok_r(ulprbbl, ",", &save); + + while (pt) { + const int rb = atoi(pt); + AssertFatal(rb < MAX_BWP_SIZE, "RB %d out of bounds (max 275 PRBs)\n", rb); + prbbl[rb] = ALL_SYMBOLS_TAKEN; + LOG_D(NR_PHY, "Blacklisting prb %d\n", rb); + pt = strtok_r(NULL, ",", &save); + num_prbbl++; + } + return num_prbbl; +} + void RCconfig_NR_L1(void) { - int j = 0; - if (RC.gNB == NULL) { - RC.gNB = (PHY_VARS_gNB **)malloc((1 + NUMBER_OF_gNB_MAX) * sizeof(PHY_VARS_gNB *)); - LOG_I(NR_PHY, "RC.gNB = %p\n", RC.gNB); - memset(RC.gNB, 0, (1 + NUMBER_OF_gNB_MAX) * sizeof(PHY_VARS_gNB *)); + LOG_I(NR_PHY, "Initializing NR L1: RC.nb_nr_L1_inst = %d\n", RC.nb_nr_L1_inst); - if (RC.gNB[j] == NULL) { - RC.gNB[j] = calloc(1, sizeof(PHY_VARS_gNB)); - } - } - if (NFAPI_MODE != NFAPI_MODE_PNF) { - paramdef_t GNBSParams[] = GNBSPARAMS_DESC; - ////////// Identification parameters - paramdef_t GNBParams[] = GNBPARAMS_DESC; + for (int j = 0; j < RC.nb_nr_L1_inst; j++) { + PHY_VARS_gNB *gNB = RC.gNB[j]; + AssertFatal(RC.gNB[j] != NULL, "gNB L1 instance is null at index %d, cannot complete L1 configuration\n", j); + // gNB params + if (NFAPI_MODE != NFAPI_MODE_PNF) { + paramdef_t GNBSParams[] = GNBSPARAMS_DESC; + paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST, NULL, 0}; + config_get(config_get_if(), GNBSParams, sizeofArray(GNBSParams), NULL); + int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; + AssertFatal(num_gnbs > 0, "Failed to parse config file, no GNBs found in field %s \n", GNB_CONFIG_STRING_ACTIVE_GNBS); - paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST, NULL, 0}; + paramdef_t GNBParams[] = GNBPARAMS_DESC; + config_getlist(config_get_if(), &GNBParamList, GNBParams, sizeofArray(GNBParams), NULL); + int N1 = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr; + int N2 = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr; + int XP = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr; - config_get(config_get_if(), GNBSParams, sizeofArray(GNBSParams), NULL); - int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; - AssertFatal(num_gnbs > 0, "Failed to parse config file no gnbs %s \n", GNB_CONFIG_STRING_ACTIVE_GNBS); - - config_getlist(config_get_if(), &GNBParamList, GNBParams, sizeofArray(GNBParams), NULL); - int N1 = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr; - int N2 = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr; - int XP = *GNBParamList.paramarray[0][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr; - char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; - if (ulprbbl) - LOG_D(NR_PHY, "PRB blacklist %s\n", ulprbbl); - char *save = NULL; - char *pt = strtok_r(ulprbbl, ",", &save); - int prbbl[275]; - int num_prbbl = 0; - memset(prbbl, 0, 275 * sizeof(int)); - - while (pt) { - const int rb = atoi(pt); - AssertFatal(rb < 275, "RB %d out of bounds (max 275)\n", rb); - prbbl[rb] = 0x3FFF; // all symbols taken - LOG_D(NR_PHY, "Blacklisting prb %d\n", atoi(pt)); - pt = strtok_r(NULL, ",", &save); - num_prbbl++; - } - - RC.gNB[j]->num_ulprbbl = num_prbbl; - LOG_D(NR_PHY, "Copying %d blacklisted PRB to L1 context\n", num_prbbl); - memcpy(RC.gNB[j]->ulprbbl, prbbl, 275 * sizeof(int)); - - RC.gNB[j]->ap_N1 = N1; - RC.gNB[j]->ap_N2 = N2; - RC.gNB[j]->ap_XP = XP; - } - - paramdef_t L1_Params[] = L1PARAMS_DESC; - paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST, NULL, 0}; - - config_getlist(config_get_if(), &L1_ParamList, L1_Params, sizeofArray(L1_Params), NULL); - - if (L1_ParamList.numelt > 0) { - for (j = 0; j < RC.nb_nr_L1_inst; j++) { - if (RC.gNB[j] == NULL) { - RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB)); - memset(RC.gNB[j], 0, sizeof(PHY_VARS_gNB)); - RC.gNB[j]->Mod_id = j; + // PRB Blacklist + uint16_t prbbl[MAX_BWP_SIZE] = {0}; + int num_ulprbbl = get_prb_blacklist(j, prbbl); + if (num_ulprbbl != -1) { + RC.gNB[j]->num_ulprbbl = num_ulprbbl; + LOG_D(NR_PHY, "Copying %d blacklisted PRB to L1 context\n", RC.gNB[j]->num_ulprbbl); + memcpy(RC.gNB[j]->ulprbbl, prbbl, MAX_BWP_SIZE * sizeof(prbbl[0])); } - AssertFatal(*L1_ParamList.paramarray[j][L1_THREAD_POOL_SIZE].uptr == 2022, "thread_pool_size removed, please use --thread-pool\n"); - RC.gNB[j]->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr); - RC.gNB[j]->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr); - RC.gNB[j]->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr); - RC.gNB[j]->pusch_thres = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr); - RC.gNB[j]->srs_thres = *(L1_ParamList.paramarray[j][L1_SRS_DTX_THRESHOLD].uptr); - RC.gNB[j]->max_ldpc_iterations = *(L1_ParamList.paramarray[j][L1_MAX_LDPC_ITERATIONS].uptr); - RC.gNB[j]->L1_rx_thread_core = *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr); - RC.gNB[j]->L1_tx_thread_core = *(L1_ParamList.paramarray[j][L1_TX_THREAD_CORE].iptr); - LOG_I(PHY,"L1_RX_THREAD_CORE %d (%d)\n",*(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr),L1_RX_THREAD_CORE); - RC.gNB[j]->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr))); - RC.gNB[j]->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr; - LOG_I(PHY, "TX_AMP = %d (-%d dBFS)\n", RC.gNB[j]->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr); - AssertFatal(RC.gNB[j]->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", RC.gNB[j]->TX_AMP); - if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) { - // sf_ahead = 2; // Need 4 subframe gap between RX and TX - } else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) { - RC.gNB[j]->eth_params_n.my_addr = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr)); - RC.gNB[j]->eth_params_n.remote_addr = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr)); - RC.gNB[j]->eth_params_n.my_portc = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr); - RC.gNB[j]->eth_params_n.remote_portc = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr); - RC.gNB[j]->eth_params_n.my_portd = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr); - RC.gNB[j]->eth_params_n.remote_portd = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr); - RC.gNB[j]->eth_params_n.transp_preference = ETH_UDP_MODE; - // sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2 + // Antenna ports + gNB->ap_N1 = N1; + gNB->ap_N2 = N2; + gNB->ap_XP = XP; + } + + // L1 params + paramdef_t L1_Params[] = L1PARAMS_DESC; + paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST, NULL, 0}; + config_getlist(config_get_if(), &L1_ParamList, L1_Params, sizeofArray(L1_Params), NULL); + if (L1_ParamList.numelt > 0) { + AssertFatal(*L1_ParamList.paramarray[j][L1_THREAD_POOL_SIZE].uptr == 2022, + "thread_pool_size removed, please use --thread-pool\n"); + gNB->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr); + gNB->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr); + gNB->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr); + gNB->pusch_thres = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr); + gNB->srs_thres = *(L1_ParamList.paramarray[j][L1_SRS_DTX_THRESHOLD].uptr); + gNB->max_ldpc_iterations = *(L1_ParamList.paramarray[j][L1_MAX_LDPC_ITERATIONS].uptr); + gNB->L1_rx_thread_core = *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr); + gNB->L1_tx_thread_core = *(L1_ParamList.paramarray[j][L1_TX_THREAD_CORE].iptr); + LOG_I(NR_PHY, "L1_RX_THREAD_CORE %d (%d)\n", *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr), L1_RX_THREAD_CORE); + gNB->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr))); + gNB->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr; + LOG_I(NR_PHY, "TX_AMP = %d (-%d dBFS)\n", gNB->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr); + AssertFatal(gNB->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", gNB->TX_AMP); + // Midhaul configuration + if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) { + // do nothing + } else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) { + gNB->eth_params_n.my_addr = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr)); + gNB->eth_params_n.remote_addr = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr)); + gNB->eth_params_n.my_portc = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr); + gNB->eth_params_n.remote_portc = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr); + gNB->eth_params_n.my_portd = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr); + gNB->eth_params_n.remote_portd = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr); + gNB->eth_params_n.transp_preference = ETH_UDP_MODE; RC.nb_nr_macrlc_inst = 1; // This is used by mac_top_init_gNB() - // This is used by init_gNB_afterRU() RC.nb_nr_CC = (int *)malloc((1 + RC.nb_nr_inst) * sizeof(int)); RC.nb_nr_CC[0] = 1; - LOG_D(PHY, - "%s() NFAPI PNF mode - RC.nb_nr_inst=1 this is because phy_init_RU() uses that to index and not RC.num_gNB - why the " - "2 similar variables?\n", - __FUNCTION__); - LOG_D(PHY, "%s() NFAPI PNF mode - RC.nb_nr_CC[0]=%d for init_gNB_afterRU()\n", __FUNCTION__, RC.nb_nr_CC[0]); - LOG_D(PHY, - "%s() NFAPI PNF mode - RC.nb_nr_macrlc_inst:%d because used by mac_top_init_gNB()\n", - __FUNCTION__, + LOG_D(NR_PHY, + "RC.nb_nr_CC[0] = %d for init_gNB_afterRU()\n" + "RC.nb_nr_macrlc_inst = %d (used by mac_top_init_gNB())\n", + RC.nb_nr_CC[0], RC.nb_nr_macrlc_inst); - configure_nr_nfapi_pnf(RC.gNB[j]->eth_params_n.remote_addr, - RC.gNB[j]->eth_params_n.remote_portc, - RC.gNB[j]->eth_params_n.my_addr, - RC.gNB[j]->eth_params_n.my_portd, - RC.gNB[j]->eth_params_n.remote_portd); - } else { // other midhaul + configure_nr_nfapi_pnf(gNB->eth_params_n.remote_addr, + gNB->eth_params_n.remote_portc, + gNB->eth_params_n.my_addr, + gNB->eth_params_n.my_portd, + gNB->eth_params_n.remote_portd); + } else { + // other midhaul, do nothing } - } // for (j = 0; j < RC.nb_nr_L1_inst; j++) - l1_north_init_gNB(); - } else { - LOG_E(PHY, "No " CONFIG_STRING_L1_LIST " configuration found"); - - // need to create some structures for VNF - - j = 0; - - if (RC.gNB[j] == NULL) { - RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB)); - memset((void *)RC.gNB[j], 0, sizeof(PHY_VARS_gNB)); - RC.gNB[j]->Mod_id = j; + LOG_D(NR_PHY, "Initializing northbound interface for L1\n"); + l1_north_init_gNB(); + } else { + LOG_E(NR_PHY, "No " CONFIG_STRING_L1_LIST " configuration found"); } } } @@ -1258,8 +1256,6 @@ static f1ap_setup_req_t *RC_read_F1Setup(uint64_t id, void RCconfig_nr_macrlc(configmodule_interface_t *cfg) { int j = 0; - uint16_t prbbl[275] = {0}; - int num_prbbl = 0; paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST, NULL, 0}; paramdef_t GNBSParams[] = GNBSPARAMS_DESC; @@ -1276,21 +1272,6 @@ void RCconfig_nr_macrlc(configmodule_interface_t *cfg) GNBParams[i].chkPptr = &(config_check_GNBParams[i]); config_getlist(cfg, &GNBParamList, GNBParams, sizeofArray(GNBParams), NULL); - if (NFAPI_MODE != NFAPI_MODE_PNF) { - ////////// Identification parameters - - char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; - char *save = NULL; - char *pt = strtok_r(ulprbbl, ",", &save); - memset(prbbl, 0, sizeof(prbbl)); - while (pt) { - const int prb = atoi(pt); - AssertFatal(prb < 275, "RB %d out of bounds (max 275)\n", prb); - prbbl[prb] = 0x3FFF; // all symbols taken - pt = strtok_r(NULL, ",", &save); - num_prbbl++; - } - } paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC; paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST, NULL, 0}; /* map parameter checking array instances to parameter definition array instances */ @@ -1482,8 +1463,13 @@ void RCconfig_nr_macrlc(configmodule_interface_t *cfg) RC.nrmac[j]->min_grant_prb = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_PRB_IDX].u8ptr); RC.nrmac[j]->min_grant_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_MCS_IDX].u8ptr); RC.nrmac[j]->identity_pm = *(MacRLC_ParamList.paramarray[j][MACRLC_IDENTITY_PM_IDX].u8ptr); - RC.nrmac[j]->num_ulprbbl = num_prbbl; - memcpy(RC.nrmac[j]->ulprbbl, prbbl, 275 * sizeof(prbbl[0])); + // PRB Blacklist + uint16_t prbbl[MAX_BWP_SIZE] = {0}; + int num_ulprbbl = get_prb_blacklist(j, prbbl); + if (num_ulprbbl != -1) { + LOG_I(NR_PHY, "Copying %d blacklisted PRB to L1 context\n", num_ulprbbl); + memcpy(RC.nrmac[j]->ulprbbl, prbbl, MAX_BWP_SIZE * sizeof(prbbl[0])); + } bool ab = *MacRLC_ParamList.paramarray[j][MACRLC_ANALOG_BEAMFORMING_IDX].u8ptr; if (ab) { NR_beam_info_t *beam_info = &RC.nrmac[j]->beam_info;