diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 0fab7b6dfa..73747638b1 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -1492,28 +1492,33 @@ void RCconfig_nr_macrlc(configmodule_interface_t *cfg) AssertFatal(config.first_active_bwp <= config.num_additional_bwps, "1st active BWP does not belog to the configured BWPs\n"); if (MacRLC_ParamList.numelt > 0) { + AssertFatal(MacRLC_ParamList.numelt == 1, "only one MACRLCs section supported!\n"); + AssertFatal(MacRLC_ParamList.numelt == RC.nb_nr_macrlc_inst, "only one MACRLCs section supported!\n"); /* NR RLC config is needed by mac_top_init_gNB() */ nr_rlc_configuration_t default_rlc_config; config_rlc(cfg, &default_rlc_config); + config.pusch.target_snrx10 = *(MacRLC_ParamList.paramarray[0][MACRLC_PUSCHTARGETSNRX10_IDX].iptr); + config.pusch.rssi_threshold = *(MacRLC_ParamList.paramarray[0][MACRLC_PUSCH_RSSI_THRES_IDX].iptr); + config.pucch.rssi_threshold = *(MacRLC_ParamList.paramarray[0][MACRLC_PUCCH_RSSI_THRES_IDX].iptr); + config.pucch.target_snrx10 = *(MacRLC_ParamList.paramarray[0][MACRLC_PUCCHTARGETSNRX10_IDX].iptr); + config.ul_prbblack_SNR_threshold = *(MacRLC_ParamList.paramarray[0][MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX].iptr); + config.pucch.failure_thres = *(MacRLC_ParamList.paramarray[0][MACRLC_PUCCHFAILURETHRES_IDX].iptr); + config.pusch.failure_thres = *(MacRLC_ParamList.paramarray[0][MACRLC_PUSCHFAILURETHRES_IDX].iptr); + + LOG_I(NR_MAC, + "PUSCH Target %d RSSI thresh %d Failure %d, PUCCH Target %d RSSI thresh %d Failure %d\n", + config.pusch.target_snrx10, + config.pusch.rssi_threshold, + config.pusch.failure_thres, + config.pucch.target_snrx10, + config.pucch.rssi_threshold, + config.pucch.failure_thres); + ngran_node_t node_type = get_node_type(); mac_top_init_gNB(node_type, scc, &config, &default_rlc_config); for (j = 0; j < RC.nb_nr_macrlc_inst; j++) { - RC.nrmac[j]->pusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr); - RC.nrmac[j]->pusch_rssi_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCH_RSSI_THRES_IDX].iptr); - RC.nrmac[j]->pucch_rssi_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCH_RSSI_THRES_IDX].iptr); - RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr); - RC.nrmac[j]->ul_prbblack_SNR_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX].iptr); - RC.nrmac[j]->pucch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr); - RC.nrmac[j]->pusch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr); - - LOG_I(NR_MAC, - "PUSCH Target %d, PUCCH Target %d, PUCCH Failure %d, PUSCH Failure %d\n", - RC.nrmac[j]->pusch_target_snrx10, - RC.nrmac[j]->pucch_target_snrx10, - RC.nrmac[j]->pucch_failure_thres, - RC.nrmac[j]->pusch_failure_thres); if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) { // check number of instances is same as RRC/PDCP diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 8366026691..062bdfc221 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -879,7 +879,7 @@ static NR_UE_harq_t *find_harq(frame_t frame, slot_t slot, NR_UE_info_t * UE, in void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01) { gNB_MAC_INST *nrmac = RC.nrmac[mod_id]; - int rssi_threshold = nrmac->pucch_rssi_threshold; + int rssi_threshold = nrmac->radio_config.pucch.rssi_threshold; NR_SCHED_LOCK(&nrmac->sched_lock); NR_UE_info_t *UE = find_nr_UE(&nrmac->UE_info, uci_01->rnti); bool is_ra = false; @@ -932,7 +932,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, con // tpc (power control) only if we received AckNack if (uci_01->harq.harq_confidence_level == 0 && uci_01->ul_cqi != 0xff) { sched_ctrl->pucch_snrx10 = uci_01->ul_cqi * 5 - 640; - sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, uci_01->ul_cqi, 30, 0); + sched_ctrl->tpc1 = nr_get_tpc(nrmac->radio_config.pucch.target_snrx10, uci_01->ul_cqi, 30, 0); } else sched_ctrl->tpc1 = 1; sched_ctrl->tpc1 = nr_limit_tpc(sched_ctrl->tpc1, uci_01->rssi, rssi_threshold); @@ -954,7 +954,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, frame_t frame, slot_t slot, c { gNB_MAC_INST *nrmac = RC.nrmac[mod_id]; NR_SCHED_LOCK(&nrmac->sched_lock); - int rssi_threshold = nrmac->pucch_rssi_threshold; + int rssi_threshold = nrmac->radio_config.pucch.rssi_threshold; NR_UE_info_t *UE = find_nr_UE(&nrmac->UE_info, uci_234->rnti); if (!UE) { @@ -969,7 +969,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, frame_t frame, slot_t slot, c // TODO PUCCH2 SNR computation is not correct -> ignore the following if (uci_234->ul_cqi != 0xff) { sched_ctrl->pucch_snrx10 = uci_234->ul_cqi * 5 - 640; - sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, uci_234->ul_cqi, 30, 0); + sched_ctrl->tpc1 = nr_get_tpc(nrmac->radio_config.pucch.target_snrx10, uci_234->ul_cqi, 30, 0); sched_ctrl->tpc1 = nr_limit_tpc(sched_ctrl->tpc1, uci_234->rssi, rssi_threshold); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index c1792cf516..f0b9e9007b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -795,7 +795,7 @@ static void nr_rx_ra_sdu(const module_id_t mod_id, } } - const int target_snrx10 = mac->pusch_target_snrx10; + const int target_snrx10 = mac->radio_config.pusch.target_snrx10; if (!sdu) { // NACK if (cfra) // no Msg3 on CFRA, no problem return; @@ -944,9 +944,9 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP, gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP]; const int current_rnti = rntiP; LOG_D(NR_MAC, "rx_sdu for rnti %04x\n", current_rnti); - const int target_snrx10 = gNB_mac->pusch_target_snrx10; - const int rssi_threshold = gNB_mac->pusch_rssi_threshold; - const int pusch_failure_thres = gNB_mac->pusch_failure_thres; + const int target_snrx10 = gNB_mac->radio_config.pusch.target_snrx10; + const int rssi_threshold = gNB_mac->radio_config.pusch.rssi_threshold; + const int pusch_failure_thres = gNB_mac->radio_config.pusch.failure_thres; NR_UE_info_t *UE = find_nr_UE(&gNB_mac->UE_info, current_rnti); if (UE) { NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl; @@ -1582,7 +1582,7 @@ void handle_nr_srs_measurements(const module_id_t module_id, sprintf(stats->srs_stats, "UL-SNR %i dB", wide_band_snr_dB); - const int ul_prbblack_SNR_threshold = nr_mac->ul_prbblack_SNR_threshold; + const int ul_prbblack_SNR_threshold = nr_mac->radio_config.ul_prbblack_SNR_threshold; uint16_t *ulprbbl = nr_mac->ulprbbl; uint16_t num_rbs = nr_srs_bf_report.prg_size * nr_srs_bf_report.reported_symbol_list[0].num_prgs; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 4de07ad299..e995cc9da0 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -184,6 +184,15 @@ typedef enum { SSB_SINR, } nr_config_report_type_t; +typedef struct nr_power_config { + /// target SNR + int target_snrx10; + /// RSSI threshold for power control. Limits power control commands when RSSI reaches threshold. + int rssi_threshold; + /// Failure threshold (compared to consecutive PUSCH DTX) + int failure_thres; +} nr_power_config_t; + typedef struct nr_mac_config_s { nr_pdsch_AntennaPorts_t pdsch_AntennaPorts; int pusch_AntennaPorts; @@ -197,8 +206,10 @@ typedef struct nr_mac_config_s { bool use_deltaMCS; int maxMIMO_layers; bool disable_harq; - //int pusch_TargetSNRx10; - //int pucch_TargetSNRx10; + nr_power_config_t pusch; + /// SNR threshold needed to put or not a PRB in the black list + int ul_prbblack_SNR_threshold; + nr_power_config_t pucch; nr_mac_timers_t timer_config; int num_dlharq; int num_ulharq; @@ -901,20 +912,6 @@ typedef struct gNB_MAC_INST_s { /// Pointer to IF module instance for PHY NR_IF_Module_t *if_inst; pthread_t stats_thread; - /// Pusch target SNR - int pusch_target_snrx10; - /// RSSI threshold for power control. Limits power control commands when RSSI reaches threshold. - int pusch_rssi_threshold; - /// Pucch target SNR - int pucch_target_snrx10; - /// RSSI threshold for PUCCH power control. Limits power control commands when RSSI reaches threshold. - int pucch_rssi_threshold; - /// SNR threshold needed to put or not a PRB in the black list - int ul_prbblack_SNR_threshold; - /// PUCCH Failure threshold (compared to consecutive PUCCH DTX) - int pucch_failure_thres; - /// PUSCH Failure threshold (compared to consecutive PUSCH DTX) - int pusch_failure_thres; /// Subcarrier Offset int ssb_SubcarrierOffset; int ssb_OffsetPointA;