From c07cbce037d7abc8bcd35291d2bbd1fa513843a8 Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 21 Oct 2022 12:01:14 +0200 Subject: [PATCH] better handling of PRACH TX power to improve separation between PHY and MAC --- CMakeLists.txt | 1 - .../nfapi/public_inc/fapi_nr_ue_interface.h | 5 +- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 2 +- .../PHY/NR_UE_ESTIMATION/nr_ue_measurements.c | 37 ++---- openair1/PHY/defs_nr_UE.h | 2 + openair1/PHY/defs_nr_common.h | 1 - openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 13 +- openair1/SCHED_NR_UE/pucch_uci_ue_nr.c | 2 +- openair1/SIMULATION/NR_PHY/prachsim.c | 13 +- openair2/GNB_APP/gnb_config.c | 1 + .../NR_MAC_COMMON/nr_compute_tbs_common.c | 4 +- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 22 ++-- openair2/LAYER2/NR_MAC_UE/mac_proto.h | 2 + openair2/LAYER2/NR_MAC_UE/main_ue_nr.c | 2 - openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c | 119 ------------------ openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h | 27 ---- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 96 +++++++++++++- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 1 - openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 13 +- openair2/RRC/NR/MESSAGES/asn1_msg.c | 1 - openair2/RRC/NR/nr_rrc_extern.h | 2 + 23 files changed, 151 insertions(+), 219 deletions(-) delete mode 100644 openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c delete mode 100644 openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8559320d51..81cc1edf76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2021,7 +2021,6 @@ set (MAC_NR_SRC_UE ${NR_UE_MAC_DIR}/nr_ue_procedures.c ${NR_UE_MAC_DIR}/nr_ue_scheduler.c ${NR_UE_MAC_DIR}/nr_ue_dci_configuration.c - ${NR_UE_MAC_DIR}/nr_l1_helpers.c ${NR_UE_MAC_DIR}/nr_ra_procedures.c ) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 15aba4a541..fe12b5c1e3 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -119,6 +119,7 @@ typedef struct { uint16_t cell_id; uint16_t ssb_start_subcarrier; short rsrp_dBm; + int16_t pathloss; } fapi_nr_ssb_pdu_t; typedef struct { @@ -193,8 +194,8 @@ typedef struct { uint8_t ssb_nb_in_ro; /// Preamble index for PRACH (0-63) uint8_t ra_PreambleIndex; - /// Target received power at gNB (TODO possibly modify to uint) - int preamble_target_power; + /// PRACH TX power (TODO possibly modify to uint) + int16_t prach_tx_power; } fapi_nr_ul_config_prach_pdu; typedef struct { diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index f01a2af606..697c70bb21 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -122,7 +122,7 @@ void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t gNB_id); -int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index); +void compute_nr_PL(PHY_VARS_NR_UE *ue, int ssb_index); void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, NR_UE_PDSCH **pdsch_vars, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c index b0756282a3..518a083ac2 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c @@ -52,34 +52,23 @@ // - PRACH transmission from a UE is not in response to a detection of a PDCCH order by the UE // Measurement units: // - referenceSignalPower: dBm/RE (average EPRE of the resources elements that carry secondary synchronization signals in dBm) -int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){ +void compute_nr_PL(PHY_VARS_NR_UE *ue, int ssb_index){ - PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - int16_t pathloss; + //TODO improve PL measurements. Probably not correct as it is. - if (get_softmodem_params()->do_ra){ + long referenceSignalPower = ue->nrUE_config.ssb_config.ss_pbch_power; + int16_t pathloss = (int16_t)(referenceSignalPower - ue->measurements.ssb_rsrp_dBm[ssb_index]); - long referenceSignalPower = ue->nrUE_config.ssb_config.ss_pbch_power; - - pathloss = (int16_t)(referenceSignalPower - ue->measurements.rsrp_dBm[gNB_index]); - - LOG_D(MAC, "In %s: pathloss %d dB, UE RX total gain %d dB, referenceSignalPower %ld dBm/RE (%f mW), RSRP %d dBm (%f mW)\n", - __FUNCTION__, - pathloss, - ue->rx_total_gain_dB, - referenceSignalPower, - pow(10, referenceSignalPower/10), - ue->measurements.rsrp_dBm[gNB_index], - pow(10, ue->measurements.rsrp_dBm[gNB_index]/10)); - - } else { - - pathloss = ((int16_t)(((10*ue->rx_total_gain_dB) - dB_fixed_times10(ue->measurements.rsrp[gNB_index]))/10)); - - } - - return pathloss; + LOG_D(PHY, "In %s: pathloss %d dB, UE RX total gain %d dB, referenceSignalPower %ld dBm/RE (%f mW), RSRP %d dBm (%f mW)\n", + __FUNCTION__, + pathloss, + ue->rx_total_gain_dB, + referenceSignalPower, + pow(10, referenceSignalPower/10), + ue->measurements.ssb_rsrp_dBm[ssb_index], + pow(10, ue->measurements.ssb_rsrp_dBm[ssb_index]/10)); + ue->measurements.pathloss = pathloss; } uint32_t get_nr_rx_total_gain_dB (module_id_t Mod_id,uint8_t CC_id) diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a2f39880ca..35dc8f2cdb 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -147,6 +147,8 @@ typedef struct { //! total estimated noise power (dBm) short n0_power_tot_dBm; + int16_t pathloss; + // UE measurements //! estimated received spatial signal power (linear) int rx_spatial_power[NUMBER_OF_CONNECTED_gNB_MAX][2][2]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index dbd402b2ac..fe0397970b 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -93,7 +93,6 @@ #define NR_MAX_NB_HARQ_PROCESSES 16 #define NR_MAX_PDSCH_TBS 3824 -#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits. #define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36 diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 672198cf99..58a893a543 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -52,7 +52,6 @@ #include "executables/softmodem-common.h" #include "executables/nr-uesoftmodem.h" #include "LAYER2/NR_MAC_UE/mac_proto.h" -#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h" //#define DEBUG_PHY_PROC #define NR_PDCCH_SCHED @@ -174,6 +173,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.cell_id = frame_parms->Nid_cell; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_start_subcarrier = frame_parms->ssb_start_subcarrier; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.rsrp_dBm = ue->measurements.ssb_rsrp_dBm[frame_parms->ssb_index]; + rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pathloss = ue->measurements.pathloss; break; case FAPI_NR_CSIRS_IND: memcpy(&rx_ind->rx_indication_body[n_pdus - 1].csirs_measurements, @@ -1100,6 +1100,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates, phy_pdcch_config); + compute_nr_PL(ue, ssb_index); if (ue->no_timing_correction==0) { LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction); @@ -1460,19 +1461,15 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t if (nr_prach == GENERATE_PREAMBLE) { fapi_nr_ul_config_prach_pdu *prach_pdu = &ue->prach_vars[gNB_id]->prach_pdu; - int16_t pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id); - int16_t ra_preamble_rx_power = (int16_t)(prach_pdu->preamble_target_power - pathloss + 30); - ue->tx_power_dBm[nr_slot_tx] = min(nr_get_Pcmax(mod_id), ra_preamble_rx_power); + ue->tx_power_dBm[nr_slot_tx] = prach_pdu->prach_tx_power; - LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm)\n", + LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, P0_PRACH %d)\n", __FUNCTION__, mod_id, frame_tx, nr_slot_tx, prach_pdu->ra_PreambleIndex, - pathloss, - ue->tx_power_dBm[nr_slot_tx], - prach_pdu->preamble_target_power); + ue->tx_power_dBm[nr_slot_tx]); ue->prach_vars[gNB_id]->amp = AMP; diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c index 163a828003..6ed543daa1 100644 --- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c +++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c @@ -215,7 +215,7 @@ void pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, /* Generate PUCCH signal according to its format and parameters */ ue->generate_ul_signal[gNB_id] = 1; - int16_t PL = get_nr_PL(ue->Mod_id, ue->CC_id, gNB_id); /* LTE function because NR path loss not yet implemented FFS TODO NR */ + int16_t PL = ue->measurements.pathloss; /* LTE function because NR path loss not yet implemented FFS TODO NR */ int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs))); int16_t pucch_tx_power = pucch_pdu->pucch_tx_power + contributor + PL; diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index d0f3af4e60..be07f22769 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -264,7 +264,6 @@ int main(int argc, char **argv){ int n_bytes=0; NR_DL_FRAME_PARMS *frame_parms; - NR_PRACH_RESOURCES_t prach_resources; nfapi_nr_prach_config_t *prach_config; nfapi_nr_prach_pdu_t *prach_pdu; fapi_nr_prach_config_t *ue_prach_config; @@ -694,7 +693,6 @@ int main(int argc, char **argv){ ue_prach_pdu = &UE->prach_vars[0]->prach_pdu; ue_prach_config = &UE->nrUE_config.prach_config; - UE->prach_resources[0] = &prach_resources; txdata = UE->common_vars.txdata; UE->prach_vars[0]->amp = AMP; @@ -717,7 +715,7 @@ int main(int argc, char **argv){ if (n_frames == 1) printf("raPreamble %d\n",preamble_tx); - UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; + ue_prach_pdu->ra_PreambleIndex = preamble_tx; // Configure channel bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index); @@ -768,14 +766,7 @@ int main(int argc, char **argv){ ue_prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index, UE->X_u); - /*tx_lev = generate_nr_prach(UE, - 0, //gNB_id, - subframe); */ //commented for testing purpose - - UE_nr_rxtx_proc_t proc={0}; - proc.frame_tx = frame; - proc.nr_slot_tx = slot; - nr_ue_prach_procedures(UE, &proc, 0); + tx_lev = generate_nr_prach(UE, 0, frame, slot); /* tx_lev_dB not used later, no need to set */ //tx_lev_dB = (unsigned int) dB_fixed(tx_lev); diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index a85840a38b..92255f065a 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -83,6 +83,7 @@ #include "NR_EUTRA-MBSFN-SubframeConfig.h" #include "RRC/NR/MESSAGES/asn1_msg.h" +#include "RRC/NR/nr_rrc_extern.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp.h" extern uint16_t sf_ahead; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c index 4d7335713a..b4bb72dd31 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c @@ -27,7 +27,6 @@ #include "common/utils/nr/nr_common.h" #include -#include "PHY/defs_nr_common.h" //Table 5.1.2.2-2 uint16_t Tbstable_nr[INDEX_MAX_TBS_TABLE] = {24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,208,224,240,256,272,288,304,320,336,352,368,384,408,432,456,480,504,528,552,576,608,640,672,704,736,768,808,848,888,928,984,1032,1064,1128,1160,1192,1224,1256,1288,1320,1352,1416,1480,1544,1608,1672,1736,1800,1864,1928,2024,2088,2152,2216,2280,2408,2472,2536,2600,2664,2728,2792,2856,2976,3104,3240,3368,3496,3624,3752,3824}; @@ -48,7 +47,8 @@ uint32_t nr_compute_tbs(uint16_t Qm, LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl); - const uint32_t nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh; + const int nb_subcarrier_per_rb = 12; + const uint32_t nbp_re = nb_subcarrier_per_rb * nb_symb_sch - nb_dmrs_prb - nb_rb_oh; const uint32_t nb_re = min(156, nbp_re) * nb_rb; // Intermediate number of information bits // Rx1024 is tabulated as 10 times the actual code rate diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 1666050e3a..4bf062dca9 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -38,9 +38,6 @@ #include #include "platform_types.h" -/* PHY */ -#include "PHY/defs_nr_common.h" - /* IF */ #include "NR_IF_Module.h" #include "fapi_nr_ue_interface.h" @@ -64,10 +61,7 @@ #include "NR_CellGroupConfig.h" #include "NR_ServingCellConfig.h" #include "NR_MeasConfig.h" -#include "fapi_nr_ue_interface.h" -#include "NR_IF_Module.h" -#include "PHY/defs_nr_common.h" -#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h" + // ========== // NR UE defs @@ -371,6 +365,16 @@ typedef struct { int8_t delta_pucch; } PUCCH_sched_t; +typedef struct { + + uint32_t ssb_index; + /// SSB RSRP in dBm + short ssb_rsrp_dBm; + /// SSB pathloss + int16_t pathloss; + +} NR_PHY_meas_t; + /*!\brief Top level UE MAC structure */ typedef struct { @@ -423,8 +427,6 @@ typedef struct { RA_config_t ra; /// SSB index from MIB decoding uint8_t mib_ssb; - /// measured SSB RSRP in dBm - short ssb_rsrp_dBm; nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG]; @@ -460,6 +462,8 @@ typedef struct { uint16_t nr_band; uint8_t ssb_subcarrier_offset; + NR_PHY_meas_t phy_measurements; + dci_pdu_rel15_t def_dci_pdu_rel15[8]; // Defined for abstracted mode diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 16b28d634d..eece1a84ff 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -431,6 +431,8 @@ void init_RA(module_id_t mod_id, NR_RACH_ConfigGeneric_t *rach_ConfigGeneric, NR_RACH_ConfigDedicated_t *rach_ConfigDedicated); +int16_t get_prach_tx_power(module_id_t mod_id); + void set_ra_rnti(NR_UE_MAC_INST_t *mac, fapi_nr_ul_config_prach_pdu *prach_pdu); void nr_Msg1_transmitted(module_id_t mod_id); diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 1e59782d21..d7162d9bf1 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -35,8 +35,6 @@ #include "radio/COMMON/common_lib.h" //#undef MALLOC #include "assertions.h" -#include "PHY/types.h" -#include "PHY/defs_UE.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h" #include "executables/softmodem-common.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp.h" diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c deleted file mode 100644 index 2d704b5c81..0000000000 --- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file nr_l1_helper.c -* \brief PHY/MAC helper functions -* \author Guido Casati -* \date 2019 -* \version 2.0 -* \email guido.casati@iis.fraunhofer.de -* @ingroup _mac - -*/ - -#include "PHY/defs_nr_common.h" -//#include "PHY/impl_defs_top.h" - -#include "mac_defs.h" -#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" -#include "LAYER2/NR_MAC_UE/mac_proto.h" -#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h" -#include "NR_P-Max.h" - -// Implementation of 6.2.4 Configured ransmitted power -// 3GPP TS 38.101-1 version 16.5.0 Release 16 -// - -// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot. -// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c -// - -// Measurement units: -// - p_max: dBm -// - delta_TC_c: dB -// - P_powerclass: dBm -// - delta_P_powerclass: dB -// - MPR_c: dB -// - delta_MPR_c: dB -// - delta_T_IB_c dB -// - delta_rx_SRS dB -// note: -// - Assuming: -// -- Powerclass 3 capable UE (which is default power class unless otherwise stated) -// -- Maximum power reduction (MPR_c) for power class 3, QPSK, inner RB allocations -// -- no additional MPR (A_MPR_c) -// todo: -// - in current implementation delta_P_powerclass is not handling power classes different from 3 -long nr_get_Pcmax(module_id_t mod_id){ - - NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); - uint32_t band = (mac->scc!=NULL) ? *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] : - *mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR; - NR_P_Max_t p_max = 0; - uint8_t P_powerclass = 23; - uint8_t delta_P_powerclass = 0; - uint8_t MPR_c = 1.5; - uint8_t delta_MPR_c = 0; - uint8_t A_MPR_c = 0; - uint8_t delta_T_IB_c = 0; - uint8_t delta_TC_c = 0; - uint8_t delta_rx_SRS = 0; - uint8_t P_MPR_c = 0; - long P_cmax_l = 0; - long P_cmax_h = 0; - long P_cmax = 0; - - if (band == 28 && mac->phy_config.config_req.carrier_config.uplink_bandwidth == 30){ - delta_MPR_c = 0.5; - } - - if (mac->cg && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1){ - if (*mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1->powerBoostPi2BPSK == 1){ - // TbD: assuming power class 3 capable UE operating in TDD bands n40, n41, n77, n78, and n79 with Pi/2 BPSK modulation - delta_P_powerclass = -3; - p_max += 3; - } - } - - NR_P_Max_t *p_Max = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max; - if (p_Max){ - - p_max += *p_Max; - - LOG_D(MAC, "In %s maximum UL transmission power p_max is %ld dBm \n", __FUNCTION__, p_max); - - P_cmax_l = min(p_max - delta_TC_c, (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c)); - - P_cmax_h = min(p_max, P_powerclass - delta_P_powerclass); - - } else { - - P_cmax_l = (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c); - - P_cmax_h = P_powerclass - delta_P_powerclass; - - } - - P_cmax = (P_cmax_h + P_cmax_l) / 2; - - LOG_D(MAC, "In %s configured maximum output power: %ld dBm <= PCMAX %ld dBm <= %ld dBm \n", __FUNCTION__, P_cmax_l, P_cmax, P_cmax_h); - - return P_cmax; - -} diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h deleted file mode 100644 index 3bfeb29e2e..0000000000 --- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/** \brief Function to compute configured maximum output power according to clause 6.2.4 of 3GPP TS 38.101-1 version 16.5.0 Release 16 - @param Mod_id Module id of UE -*/ -long nr_get_Pcmax(module_id_t mod_id); -/** @}*/ - diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index f18f926bd4..bfcc5fa2eb 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -34,18 +34,102 @@ #include "NR_RACH-ConfigCommon.h" #include "RRC/NR_UE/rrc_proto.h" -/* PHY */ -#include "PHY/NR_UE_ESTIMATION/nr_estimation.h" - /* MAC */ #include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" #include "NR_MAC_COMMON/nr_mac.h" #include "LAYER2/NR_MAC_UE/mac_proto.h" -#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h" #include -void nr_get_RA_window(NR_UE_MAC_INST_t *mac); +// Implementation of 6.2.4 Configured ransmitted power +// 3GPP TS 38.101-1 version 16.5.0 Release 16 +// - +// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot. +// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c +// - +// Measurement units: +// - p_max: dBm +// - delta_TC_c: dB +// - P_powerclass: dBm +// - delta_P_powerclass: dB +// - MPR_c: dB +// - delta_MPR_c: dB +// - delta_T_IB_c dB +// - delta_rx_SRS dB +// note: +// - Assuming: +// -- Powerclass 3 capable UE (which is default power class unless otherwise stated) +// -- Maximum power reduction (MPR_c) for power class 3, QPSK, inner RB allocations +// -- no additional MPR (A_MPR_c) +// todo: +// - in current implementation delta_P_powerclass is not handling power classes different from 3 +long nr_get_Pcmax(module_id_t mod_id){ + + NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); + uint32_t band = (mac->scc!=NULL) ? *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] : + *mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR; + NR_P_Max_t p_max = 0; + uint8_t P_powerclass = 23; + uint8_t delta_P_powerclass = 0; + uint8_t MPR_c = 1.5; + uint8_t delta_MPR_c = 0; + uint8_t A_MPR_c = 0; + uint8_t delta_T_IB_c = 0; + uint8_t delta_TC_c = 0; + uint8_t delta_rx_SRS = 0; + uint8_t P_MPR_c = 0; + long P_cmax_l = 0; + long P_cmax_h = 0; + long P_cmax = 0; + + if (band == 28 && mac->phy_config.config_req.carrier_config.uplink_bandwidth == 30){ + delta_MPR_c = 0.5; + } + + if (mac->cg && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1){ + if (*mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1->powerBoostPi2BPSK == 1){ + // TbD: assuming power class 3 capable UE operating in TDD bands n40, n41, n77, n78, and n79 with Pi/2 BPSK modulation + delta_P_powerclass = -3; + p_max += 3; + } + } + + NR_P_Max_t *p_Max = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max; + if (p_Max){ + + p_max += *p_Max; + + LOG_D(MAC, "In %s maximum UL transmission power p_max is %ld dBm \n", __FUNCTION__, p_max); + + P_cmax_l = min(p_max - delta_TC_c, (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c)); + + P_cmax_h = min(p_max, P_powerclass - delta_P_powerclass); + + } else { + + P_cmax_l = (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c); + + P_cmax_h = P_powerclass - delta_P_powerclass; + + } + + P_cmax = (P_cmax_h + P_cmax_l) / 2; + + LOG_D(MAC, "In %s configured maximum output power: %ld dBm <= PCMAX %ld dBm <= %ld dBm \n", __FUNCTION__, P_cmax_l, P_cmax, P_cmax_h); + + return P_cmax; + +} + +int16_t get_prach_tx_power(module_id_t mod_id) { + + NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); + RA_config_t *ra = &mac->ra; + int16_t pathloss = mac->phy_measurements.pathloss; + int16_t ra_preamble_rx_power = (int16_t)(ra->prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER - pathloss + 30); + return min(nr_get_Pcmax(mod_id), ra_preamble_rx_power); + +} // Random Access procedure initialization as per 5.1.1 and initialization of variables specific // to Random Access type as specified in clause 5.1.1a (3GPP TS 38.321 version 16.2.1 Release 16) @@ -594,7 +678,7 @@ void nr_get_prach_resources(module_id_t mod_id, } else { /* TODO: This controls the tx_power of UE and the ramping procedure of RA of UE. Later we can abstract this, perhaps in the proxy. But for the time being lets leave it as below. */ - int16_t dl_pathloss = !get_softmodem_params()->emulate_l1 ? get_nr_PL(mod_id, CC_id, gNB_id) : 0; + int16_t dl_pathloss = !get_softmodem_params()->emulate_l1 ? mac->phy_measurements.pathloss : 0; ssb_rach_config(ra, prach_resources, nr_rach_ConfigCommon, prach_pdu); ra_preambles_config(prach_resources, mac, dl_pathloss); LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-based random access procedure... \n", ra->ra_PreambleIndex); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 6b04441cb3..7559bdea81 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2637,7 +2637,7 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, } } AssertFatal(*SSB_resource.list.array[ssb_rsrp[0][0]] == mac->mib_ssb, "Couldn't find corresponding SSB in csi_SSB_ResourceList\n"); - ssb_rsrp[1][0] = mac->ssb_rsrp_dBm; + ssb_rsrp[1][0] = mac->phy_measurements.ssb_rsrp_dBm; uint8_t ssbi; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 7f6af3a444..903b20b037 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -2802,7 +2802,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s nr_get_prach_resources(module_idP, 0, 0, &ra->prach_resources, prach_config_pdu, ra->rach_ConfigDedicated); prach_config_pdu->ra_PreambleIndex = ra->ra_PreambleIndex; - prach_config_pdu->preamble_target_power = ra->prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER; + prach_config_pdu->prach_tx_power = get_prach_tx_power(module_idP); set_ra_rnti(mac, prach_config_pdu); fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, NULL); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index d310c461dc..24772f7493 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -34,7 +34,6 @@ #include "common/utils/nr/nr_common.h" #include "utils.h" #include - #include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" //#define SRS_IND_DEBUG diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index e548717459..623567354d 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1085,6 +1085,14 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t } +void handle_ssb_meas(NR_UE_MAC_INST_t *mac, uint8_t ssb_index, int16_t rsrp_dbm, int16_t pathloss) { + + mac->phy_measurements.ssb_index = ssb_index; + mac->phy_measurements.ssb_rsrp_dBm = rsrp_dbm; + mac->phy_measurements.pathloss = pathloss; + +} + // L2 Abstraction Layer // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){ @@ -1225,7 +1233,10 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){ case FAPI_NR_RX_PDU_TYPE_SSB: - mac->ssb_rsrp_dBm = (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.rsrp_dBm; + handle_ssb_meas(mac, + (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_index, + (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.rsrp_dBm, + (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pathloss); ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index, dl_info->phy_data, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.additional_bits, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 9b782cc9bb..6cdf1adeaa 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -75,7 +75,6 @@ #include "NR_DLInformationTransfer.h" #include "NR_RRCReestablishmentRequest.h" #include "NR_UE-CapabilityRequestFilterNR.h" -#include "PHY/defs_nr_common.h" #include "common/utils/nr/nr_common.h" #if defined(NR_Rel16) #include "NR_SCS-SpecificCarrier.h" diff --git a/openair2/RRC/NR/nr_rrc_extern.h b/openair2/RRC/NR/nr_rrc_extern.h index 3b08a24027..af2cfdd2c8 100644 --- a/openair2/RRC/NR/nr_rrc_extern.h +++ b/openair2/RRC/NR/nr_rrc_extern.h @@ -35,6 +35,8 @@ #include "LAYER2/MAC/mac.h" #include "LAYER2/RLC/rlc.h" +#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits. + extern UE_RRC_INST *UE_rrc_inst; extern uint8_t DRB2LCHAN[8];