Merge remote-tracking branch 'origin/multi-ue-test' into integration_2025_w35 (!3425)
RFSim test for 10 UEs/process This MR adds a testcase and changes required to run 10 UEs in a single process with RFSim - Added deregistration for all connected UEs - Refactored MAC/RRC instance handling - made map_current_symbol thread safe - made opeanir0_cfg thread safe and local - Added 10UE/process testcase
This commit is contained in:
@@ -449,12 +449,15 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
peak_estimator(&chT_interpol[rxAnt][0], NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size, &prs_toa, &ch_pwr, mean_val);
|
||||
|
||||
// adjusting the rx_gains for channel peak power
|
||||
ch_pwr_dbm = 10 * log10(ch_pwr) + 30 - SQ15_SQUARED_NORM_FACTOR_DB - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(frame_params->ofdm_symbol_size);
|
||||
ch_pwr_dbm = 10 * log10(ch_pwr) + 30 - SQ15_SQUARED_NORM_FACTOR_DB
|
||||
- ((int)ue->openair0_cfg[0].rx_gain[0] - (int)ue->openair0_cfg[0].rx_gain_offset[0])
|
||||
- dB_fixed(frame_params->ofdm_symbol_size);
|
||||
|
||||
prs_meas[rxAnt]->rsrp_dBm =
|
||||
10 * log10(prs_meas[rxAnt]->rsrp) + 30 - SQ15_SQUARED_NORM_FACTOR_DB - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
prs_meas[rxAnt]->rsrp_dBm = 10 * log10(prs_meas[rxAnt]->rsrp) + 30 - SQ15_SQUARED_NORM_FACTOR_DB
|
||||
- ((int)ue->openair0_cfg[0].rx_gain[0] - (int)ue->openair0_cfg[0].rx_gain_offset[0])
|
||||
- dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
//prs measurements
|
||||
// prs measurements
|
||||
prs_meas[rxAnt]->gNB_id = gNB_id;
|
||||
prs_meas[rxAnt]->sfn = proc->frame_rx;
|
||||
prs_meas[rxAnt]->slot = proc->nr_slot_rx;
|
||||
|
||||
@@ -152,6 +152,7 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
|
||||
int nr_sl_psbch_rsrp_measurements(sl_nr_ue_phy_params_t *sl_phy_params,
|
||||
NR_DL_FRAME_PARMS *fp,
|
||||
c16_t rxdataF[][fp->samples_per_slot_wCP],
|
||||
bool use_SSS);
|
||||
bool use_SSS,
|
||||
openair0_config_t *openair0_cfg);
|
||||
/** @}*/
|
||||
#endif
|
||||
|
||||
@@ -157,7 +157,9 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||
ue->measurements.rx_power_avg_dB[gNB_id] = dB_fixed( ue->measurements.rx_power_avg[gNB_id]);
|
||||
ue->measurements.wideband_cqi_tot[gNB_id] = ue->measurements.rx_power_tot_dB[gNB_id] - ue->measurements.n0_power_tot_dB;
|
||||
ue->measurements.wideband_cqi_avg[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] - dB_fixed(ue->measurements.n0_power_avg);
|
||||
ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] + 30 - SQ15_SQUARED_NORM_FACTOR_DB - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] + 30 - SQ15_SQUARED_NORM_FACTOR_DB
|
||||
- ((int)ue->openair0_cfg[0].rx_gain[0] - (int)ue->openair0_cfg[0].rx_gain_offset[0])
|
||||
- dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
LOG_D(PHY, "[gNB %d] Slot %d, RSSI %d dB (%d dBm/RE), WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
|
||||
gNB_id,
|
||||
@@ -235,7 +237,7 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||
uint32_t rsrp_avg = nr_ue_calculate_ssb_rsrp(fp, proc, rxdataF, symbol_offset, fp->ssb_start_subcarrier);
|
||||
float rsrp_db_per_re = 10 * log10(rsrp_avg);
|
||||
|
||||
openair0_config_t *cfg0 = &openair0_cfg[0];
|
||||
openair0_config_t *cfg0 = &ue->openair0_cfg[0];
|
||||
|
||||
ue->measurements.ssb_rsrp_dBm[ssb_index] = rsrp_db_per_re + 30 - SQ15_SQUARED_NORM_FACTOR_DB
|
||||
- ((int)cfg0->rx_gain[0] - (int)cfg0->rx_gain_offset[0])
|
||||
@@ -271,8 +273,8 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
|
||||
const uint8_t k_length = 8;
|
||||
uint8_t l_sss = (ue->symbol_offset + 2) % ue->frame_parms.symbols_per_slot;
|
||||
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
|
||||
double rx_gain = openair0_cfg[0].rx_gain[0];
|
||||
double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
|
||||
double rx_gain = ue->openair0_cfg[0].rx_gain[0];
|
||||
double rx_gain_offset = ue->openair0_cfg[0].rx_gain_offset[0];
|
||||
|
||||
ue->measurements.n0_power_tot = 0;
|
||||
|
||||
@@ -344,7 +346,8 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
|
||||
int nr_sl_psbch_rsrp_measurements(sl_nr_ue_phy_params_t *sl_phy_params,
|
||||
NR_DL_FRAME_PARMS *fp,
|
||||
c16_t rxdataF[][fp->samples_per_slot_wCP],
|
||||
bool use_SSS)
|
||||
bool use_SSS,
|
||||
openair0_config_t *openair0_cfg)
|
||||
{
|
||||
SL_NR_UE_PSBCH_t *psbch_rx = &sl_phy_params->psbch;
|
||||
uint8_t numsym = (fp->Ncp) ? SL_NR_NUM_SYMBOLS_SSB_EXT_CP : SL_NR_NUM_SYMBOLS_SSB_NORMAL_CP;
|
||||
|
||||
@@ -238,7 +238,7 @@ static int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
|
||||
|
||||
*rsrp = rsrp_sum/meas_count;
|
||||
*rsrp_dBm = dB_fixed(*rsrp) + 30 - SQ15_SQUARED_NORM_FACTOR_DB
|
||||
- ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
- ((int)ue->openair0_cfg[0].rx_gain[0] - (int)ue->openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
#ifdef NR_CSIRS_DEBUG
|
||||
LOG_I(NR_PHY, "RSRP = %i (%i dBm)\n", *rsrp, *rsrp_dBm);
|
||||
|
||||
@@ -518,7 +518,7 @@ nr_initial_sync_t sl_nr_slss_search(PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc,
|
||||
sync_params->DFN,
|
||||
sync_params->slot_offset);
|
||||
|
||||
UE->adjust_rxgain = nr_sl_psbch_rsrp_measurements(sl_ue, frame_parms, rxdataF, false);
|
||||
UE->adjust_rxgain = nr_sl_psbch_rsrp_measurements(sl_ue, frame_parms, rxdataF, false, UE->openair0_cfg);
|
||||
|
||||
UE->init_sync_frame = sync_params->remaining_frames;
|
||||
result.rx_offset = sync_params->rx_offset;
|
||||
|
||||
@@ -91,8 +91,8 @@ The function pointers are set once before calling the mapping funcion for
|
||||
all symbols based on different parameters. Then the mapping is done for
|
||||
each symbol by calling the function pointers.
|
||||
*/
|
||||
static void (*map_dmrs_ptr)(const unsigned int, const c16_t *, c16_t *);
|
||||
static void (*map_data_dmrs_ptr)(const unsigned int num_cdm_no_data, const c16_t *, c16_t *);
|
||||
typedef void (*map_dmrs_func_t)(const unsigned int, const c16_t *, c16_t *);
|
||||
typedef void (*map_data_dmrs_func_t)(const unsigned int, const c16_t *, c16_t *);
|
||||
|
||||
/*
|
||||
The following set of functions map dmrs and/or data REs in one RB based on
|
||||
@@ -191,7 +191,9 @@ static void map_over_dc(const unsigned int right_dc,
|
||||
const c16_t **ptrs,
|
||||
const c16_t **dmrs,
|
||||
const c16_t **data,
|
||||
c16_t **out)
|
||||
c16_t **out,
|
||||
map_dmrs_func_t map_data_dmrs_ptr,
|
||||
map_dmrs_func_t map_dmrs_ptr)
|
||||
{
|
||||
// if first RE is DC no need to map in this function
|
||||
if (right_dc == 0)
|
||||
@@ -277,7 +279,9 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
const c16_t *dmrs_seq,
|
||||
const c16_t *ptrs_seq,
|
||||
const c16_t **data,
|
||||
c16_t *out)
|
||||
c16_t *out,
|
||||
map_dmrs_func_t map_dmrs_ptr,
|
||||
map_data_dmrs_func_t map_data_dmrs_ptr)
|
||||
{
|
||||
const unsigned int abs_start_rb = p.bwp_start + p.start_rb;
|
||||
const unsigned int start_sc = (p.first_sc_offset + abs_start_rb * NR_NB_SC_PER_RB) % p.fft_size;
|
||||
@@ -297,7 +301,7 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
// map RB at DC
|
||||
if (rb_over_dc) {
|
||||
// if DC is in middle of RB, the following function handles it.
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, dmrs_per_rb, data_per_rb, p.delta, 0, NULL, &p_mod_dmrs, NULL, &out_tmp);
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, dmrs_per_rb, data_per_rb, p.delta, 0, NULL, &p_mod_dmrs, NULL, &out_tmp, map_data_dmrs_ptr, map_dmrs_ptr);
|
||||
continue;
|
||||
} else {
|
||||
// else just move the pointer and following function will map the rb
|
||||
@@ -315,7 +319,7 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
for (unsigned int rb = 0; rb < p.nb_rb; rb++) {
|
||||
if (rb == dc_rb) {
|
||||
if (rb_over_dc) {
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, dmrs_per_rb, data_per_rb, p.delta, 0, NULL, &p_mod_dmrs, &data_tmp, &out_tmp);
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, dmrs_per_rb, data_per_rb, p.delta, 0, NULL, &p_mod_dmrs, &data_tmp, &out_tmp, map_data_dmrs_ptr, map_dmrs_ptr);
|
||||
continue;
|
||||
} else {
|
||||
out_tmp -= p.fft_size;
|
||||
@@ -339,7 +343,7 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
if (rb < non_ptrs_rb || ptrs_idx_rb % p.K_ptrs) {
|
||||
if (rb == dc_rb) {
|
||||
if (rb_over_dc) {
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, 0, NULL, NULL, &data_tmp, &out_tmp);
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, 0, NULL, NULL, &data_tmp, &out_tmp, map_data_dmrs_ptr, map_dmrs_ptr);
|
||||
continue;
|
||||
} else {
|
||||
out_tmp -= p.fft_size;
|
||||
@@ -351,7 +355,7 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
} else {
|
||||
if (rb == dc_rb) {
|
||||
if (rb_over_dc) {
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, ptrs_idx_re, &p_mod_ptrs, NULL, &data_tmp, &out_tmp);
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, ptrs_idx_re, &p_mod_ptrs, NULL, &data_tmp, &out_tmp, map_data_dmrs_ptr, map_dmrs_ptr);
|
||||
continue;
|
||||
} else {
|
||||
out_tmp -= p.fft_size;
|
||||
@@ -370,7 +374,7 @@ static void map_current_symbol(const nr_phy_pxsch_params_t p,
|
||||
for (unsigned int rb = 0; rb < p.nb_rb; rb++) {
|
||||
if (rb == dc_rb) {
|
||||
if (rb_over_dc) {
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, 0, NULL, NULL, &data_tmp, &out_tmp);
|
||||
map_over_dc(rb_over_dc, n_cdm, p.fft_size, 0, 0, p.delta, 0, NULL, NULL, &data_tmp, &out_tmp, map_data_dmrs_ptr, map_dmrs_ptr);
|
||||
continue;
|
||||
} else {
|
||||
out_tmp -= p.fft_size;
|
||||
@@ -420,6 +424,8 @@ static void map_symbols(const nr_phy_pxsch_params_t p,
|
||||
c16_t *out)
|
||||
{
|
||||
// asign the function pointers
|
||||
map_dmrs_func_t map_dmrs_ptr = NULL;
|
||||
map_data_dmrs_func_t map_data_dmrs_ptr = NULL;
|
||||
if (p.dmrs_type == pusch_dmrs_type1) {
|
||||
map_dmrs_ptr = map_dmrs_type1_cdm1_rb;
|
||||
map_data_dmrs_ptr = (p.num_cdm_no_data == 1) ? map_data_dmrs_type1_cdm1_rb : NULL;
|
||||
@@ -460,7 +466,9 @@ static void map_symbols(const nr_phy_pxsch_params_t p,
|
||||
mod_dmrs_amp,
|
||||
mod_ptrs_amp,
|
||||
&cur_data, // increments every symbol
|
||||
out + l * p.fft_size);
|
||||
out + l * p.fft_size,
|
||||
map_dmrs_ptr,
|
||||
map_data_dmrs_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -336,6 +336,7 @@ typedef struct {
|
||||
|
||||
/// Top-level PHY Data Structure for UE
|
||||
typedef struct PHY_VARS_NR_UE_s {
|
||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
/// \brief Module ID indicator for this instance
|
||||
uint8_t Mod_id;
|
||||
/// \brief Component carrier ID for this PHY instance
|
||||
|
||||
@@ -227,7 +227,7 @@ int psbch_pscch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr
|
||||
sym = (sym == 0) ? 5 : sym + 1;
|
||||
}
|
||||
|
||||
ue->adjust_rxgain = nr_sl_psbch_rsrp_measurements(sl_phy_params, fp, rxdataF, false);
|
||||
ue->adjust_rxgain = nr_sl_psbch_rsrp_measurements(sl_phy_params, fp, rxdataF, false, ue->openair0_cfg);
|
||||
|
||||
LOG_D(NR_PHY, " ------ Decode SL-MIB: frame.slot %d.%d ------ \n", frame_rx % 1024, nr_slot_rx);
|
||||
|
||||
|
||||
@@ -924,8 +924,7 @@ printf("%d\n", slot);
|
||||
|
||||
init_nr_ue_transport(UE);
|
||||
|
||||
nr_l2_init_ue(1);
|
||||
UE_mac = get_mac_inst(0);
|
||||
UE_mac = nr_l2_init_ue(0);
|
||||
ue_init_config_request(UE_mac, get_slots_per_frame_from_scs(mu));
|
||||
|
||||
UE->if_inst = nr_ue_if_module_init(0);
|
||||
|
||||
@@ -780,8 +780,7 @@ int main(int argc, char *argv[])
|
||||
init_nr_ue_transport(UE);
|
||||
|
||||
//Configure UE
|
||||
nr_l2_init_ue(1);
|
||||
NR_UE_MAC_INST_t* UE_mac = get_mac_inst(0);
|
||||
NR_UE_MAC_INST_t* UE_mac = nr_l2_init_ue(0);
|
||||
|
||||
ue_init_config_request(UE_mac, get_slots_per_frame_from_scs(mu));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user