From e198b741558099b496f99f1e2f223558ce42ad3b Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 15 Jun 2023 12:18:06 +0200 Subject: [PATCH 1/3] fixes running FR2 test with sanitize --- executables/nr-gnb.c | 29 ++++++++++++------- executables/nr-ru.c | 11 ++++--- openair1/PHY/INIT/nr_parms.c | 2 +- openair1/PHY/MODULATION/slot_fep_nr.c | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 6 ++-- openair2/LAYER2/NR_MAC_gNB/config.c | 6 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 5 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 4 +-- 8 files changed, 37 insertions(+), 28 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index fd5439ce74..3957d3fe05 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -112,25 +112,28 @@ time_stats_t softmodem_stats_rx_sf; // total rx time void tx_func(void *param) { - processingData_L1tx_t *info = (processingData_L1tx_t *) param; + PHY_VARS_gNB *gNB = info->gNB; int frame_tx = info->frame; int slot_tx = info->slot; - - int absslot_tx = info->timestamp_tx/info->gNB->frame_parms.get_samples_per_slot(slot_tx,&info->gNB->frame_parms); - int absslot_rx = absslot_tx-info->gNB->RU_list[0]->sl_ahead; + int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); + int i = 0; + for (i = 1; i < gNB->frame_parms.slots_per_subframe / 2; i++) + cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms); + int samples = cumul_samples / (i + 1); + int absslot_tx = info->timestamp_tx / samples; + int absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; - start_meas(&info->gNB->phy_proc_tx); + start_meas(&gNB->phy_proc_tx); - clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.start_L1_TX[rt_prof_idx]); + clock_gettime(CLOCK_MONOTONIC, &gNB->rt_L1_profiling.start_L1_TX[rt_prof_idx]); phy_procedures_gNB_TX(info, frame_tx, slot_tx, 1); - clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]); + clock_gettime(CLOCK_MONOTONIC, &gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]); if (get_softmodem_params()->reorder_thread_disable) { - PHY_VARS_gNB *gNB = info->gNB; processingData_RU_t syncMsgRU; syncMsgRU.frame_tx = frame_tx; syncMsgRU.slot_tx = slot_tx; @@ -141,7 +144,7 @@ void tx_func(void *param) } /* this thread is done with the sched_info, decrease the reference counter */ deref_sched_response(info->sched_response_id); - stop_meas(&info->gNB->phy_proc_tx); + stop_meas(&gNB->phy_proc_tx); } @@ -180,10 +183,14 @@ void rx_func(void *param) int slot_tx = info->slot_tx; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - int absslot_tx = info->timestamp_tx/gNB->frame_parms.get_samples_per_slot(slot_rx,&gNB->frame_parms); + int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); + int i = 0; + for (i = 1; i < gNB->frame_parms.slots_per_subframe / 2; i++) + cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms); + int samples = cumul_samples / (i + 1); + int absslot_tx = info->timestamp_tx / samples; int absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; - clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.start_L1_RX[rt_prof_idx]); start_meas(&softmodem_stats_rxtx_sf); diff --git a/executables/nr-ru.c b/executables/nr-ru.c index c9d3dab560..3cae919d9e 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -1015,10 +1015,13 @@ void ru_tx_func(void *param) { int print_frame = 8; char filename[40]; - - // note that this will break for 60/120 kHz, to be handled - int absslot_tx = info->timestamp_tx/fp->get_samples_per_slot(slot_tx,fp); - int absslot_rx = absslot_tx-ru->sl_ahead; + int cumul_samples = fp->get_samples_per_slot(0, fp); + int i = 0; + for (i = 1; i < fp->slots_per_subframe / 2; i++) + cumul_samples += fp->get_samples_per_slot(i, fp); + int samples = cumul_samples / (i + 1); + int absslot_tx = info->timestamp_tx / samples; + int absslot_rx = absslot_tx - ru->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.start_RU_TX[rt_prof_idx]); // do TX front-end processing if needed (precoding and/or IDFTs) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index c444440451..2043668f2d 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -180,7 +180,7 @@ uint32_t get_samples_per_slot(int slot, NR_DL_FRAME_PARMS* fp) if(fp->numerology_index == 0) samp_count = fp->samples_per_subframe; else - samp_count = (slot%(fp->slots_per_subframe/2)) ? fp->samples_per_slotN0 : fp->samples_per_slot0; + samp_count = (slot % (fp->slots_per_subframe / 2)) ? fp->samples_per_slotN0 : fp->samples_per_slot0; return samp_count; } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index c8ec74d61f..0af0ca4b0d 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -229,7 +229,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms, { unsigned int nb_prefix_samples = frame_parms->nb_prefix_samples; unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0; - + dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size); // This is for misalignment issues int32_t tmp_dft_in[8192] __attribute__ ((aligned (32))); diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 395a69b0b3..ea4e6b83f6 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -355,7 +355,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, switch (scc->ssb_PositionsInBurst->present) { case 1 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0] << 24; cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; break; case 2 : @@ -366,8 +366,8 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0; cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; for (int i = 0; i < 4; i++) { - cfg->ssb_table.ssb_mask_list[0].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[3-i]<ssb_table.ssb_mask_list[1].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[7-i]<ssb_table.ssb_mask_list[0].ssb_mask += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8); + cfg->ssb_table.ssb_mask_list[1].ssb_mask += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8); } break; default: diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 39f72831f4..488a41f2f2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -331,7 +331,7 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch switch (scc->ssb_PositionsInBurst->present) { case 1 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0] << 24; cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0; break; case 2 : @@ -342,8 +342,8 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = 0; cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0; for (int i=0; i<4; i++) { - cfg->ssb_table.ssb_mask_list[0].ssb_mask.value += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[3-i]<ssb_table.ssb_mask_list[1].ssb_mask.value += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[7-i]<ssb_table.ssb_mask_list[0].ssb_mask.value += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8); + cfg->ssb_table.ssb_mask_list[1].ssb_mask.value += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8); } break; default: diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 0d66ec0842..b08ffd520f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -99,10 +99,9 @@ static void fill_ssb_vrb_map(NR_COMMON_channels_t *cc, int rbStart, int ssb_subc "240kHZ subcarrier won't work with current VRB map because a single SSB might be across 2 slots\n"); uint16_t *vrb_map = cc[CC_id].vrb_map; - const int extra_prb = ssb_subcarrier_offset > 0; - for (int rb = 0; rb < 20+extra_prb; rb++) - vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4); + for (int rb = 0; rb < 20 + extra_prb; rb++) + vrb_map[rbStart + rb] = SL_to_bitmap(symStart % 14, 4); } void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index d7f461d231..850b62dc8a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -636,12 +636,12 @@ static void evaluate_rsrp_report(NR_UE_info_t *UE, if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type) { sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] = - *(csi_report->SSB_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]); + *(csi_report->SSB_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1U<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]); LOG_D(MAC,"SSB_index = %d\n",sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]); } else { sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] = - *(csi_report->CSI_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]); + *(csi_report->CSI_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1U<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]); LOG_D(MAC,"CSI-RS Resource Indicator = %d\n",sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]); } *cumul_bits += cri_ssbri_bitlen; From 02e1b64379ae503f166992ac8b0b08e4d85a4f91 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 13 Jul 2023 16:48:19 +0200 Subject: [PATCH 2/3] small code review --- openair1/PHY/defs_nr_common.h | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/config.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 2b0a07fda7..ea0b3cc24b 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -45,7 +45,7 @@ #define MAX_NUM_SUBCARRIER_SPACING 5 #define NR_MAX_OFDM_SYMBOL_SIZE 4096 -#define NR_SYMBOLS_PER_SLOT 14 +#define NR_SYMBOLS_PER_SLOT NR_NUMBER_OF_SYMBOLS_PER_SLOT #define ONE_OVER_SQRT2_Q15 23170 #define ONE_OVER_TWO_Q15 16384 diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index ea4e6b83f6..0369f678fd 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -366,8 +366,8 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0; cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; for (int i = 0; i < 4; i++) { - cfg->ssb_table.ssb_mask_list[0].ssb_mask += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8); - cfg->ssb_table.ssb_mask_list[1].ssb_mask += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8); + cfg->ssb_table.ssb_mask_list[0].ssb_mask += (uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8; + cfg->ssb_table.ssb_mask_list[1].ssb_mask += (uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8; } break; default: diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 488a41f2f2..58072c1e0e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -342,8 +342,8 @@ static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = 0; cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0; for (int i=0; i<4; i++) { - cfg->ssb_table.ssb_mask_list[0].ssb_mask.value += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8); - cfg->ssb_table.ssb_mask_list[1].ssb_mask.value += ((uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8); + cfg->ssb_table.ssb_mask_list[0].ssb_mask.value += (uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[3 - i] << i * 8; + cfg->ssb_table.ssb_mask_list[1].ssb_mask.value += (uint32_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[7 - i] << i * 8; } break; default: diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index b08ffd520f..49d23185dc 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -40,6 +40,7 @@ #include "UTIL/OPT/opt.h" #include "RRC/NR/nr_rrc_config.h" #include "common/utils/nr/nr_common.h" +#include "openair1/PHY/defs_nr_common.h" #define ENABLE_MAC_PAYLOAD_DEBUG @@ -101,7 +102,7 @@ static void fill_ssb_vrb_map(NR_COMMON_channels_t *cc, int rbStart, int ssb_subc uint16_t *vrb_map = cc[CC_id].vrb_map; const int extra_prb = ssb_subcarrier_offset > 0; for (int rb = 0; rb < 20 + extra_prb; rb++) - vrb_map[rbStart + rb] = SL_to_bitmap(symStart % 14, 4); + vrb_map[rbStart + rb] = SL_to_bitmap(symStart % NR_SYMBOLS_PER_SLOT, 4); } void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req) From c56b4bf515148dff13341930f411d290288d07e1 Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 14 Jul 2023 18:19:51 +0200 Subject: [PATCH 3/3] fix computation of absolute slot --- executables/nr-gnb.c | 13 ++++++------- executables/nr-ru.c | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 3957d3fe05..33fe6b3f2a 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -117,10 +117,10 @@ void tx_func(void *param) int frame_tx = info->frame; int slot_tx = info->slot; int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); - int i = 0; - for (i = 1; i < gNB->frame_parms.slots_per_subframe / 2; i++) + int i = 1; + for (; i < gNB->frame_parms.slots_per_subframe / 2; i++) cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms); - int samples = cumul_samples / (i + 1); + int samples = cumul_samples / i; int absslot_tx = info->timestamp_tx / samples; int absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; @@ -182,12 +182,11 @@ void rx_func(void *param) int frame_tx = info->frame_tx; int slot_tx = info->slot_tx; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); - int i = 0; - for (i = 1; i < gNB->frame_parms.slots_per_subframe / 2; i++) + int i = 1; + for (; i < gNB->frame_parms.slots_per_subframe / 2; i++) cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms); - int samples = cumul_samples / (i + 1); + int samples = cumul_samples / i; int absslot_tx = info->timestamp_tx / samples; int absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 3cae919d9e..0426ee5405 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -1016,10 +1016,10 @@ void ru_tx_func(void *param) { char filename[40]; int cumul_samples = fp->get_samples_per_slot(0, fp); - int i = 0; - for (i = 1; i < fp->slots_per_subframe / 2; i++) + int i = 1; + for (; i < fp->slots_per_subframe / 2; i++) cumul_samples += fp->get_samples_per_slot(i, fp); - int samples = cumul_samples / (i + 1); + int samples = cumul_samples / i; int absslot_tx = info->timestamp_tx / samples; int absslot_rx = absslot_tx - ru->sl_ahead; int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;