From 88a95e8e57cffb2f026a2c0b81e11a185105fdf7 Mon Sep 17 00:00:00 2001 From: Francisco Paisana Date: Fri, 4 Feb 2022 13:12:37 +0000 Subject: [PATCH] rrc,gnb: remove uneeded flat phy cfg fields from rrc_nr_cfg_t --- lib/include/srsran/asn1/rrc_nr_utils.h | 8 +++ lib/src/asn1/rrc_nr_utils.cc | 85 ++++++++++++++++++++++++++ srsgnb/hdr/stack/rrc/rrc_nr_config.h | 11 ---- srsgnb/src/stack/rrc/rrc_nr.cc | 36 +++++------ 4 files changed, 107 insertions(+), 33 deletions(-) diff --git a/lib/include/srsran/asn1/rrc_nr_utils.h b/lib/include/srsran/asn1/rrc_nr_utils.h index c005a7bfe..a303f7815 100644 --- a/lib/include/srsran/asn1/rrc_nr_utils.h +++ b/lib/include/srsran/asn1/rrc_nr_utils.h @@ -124,6 +124,14 @@ bool make_phy_zp_csi_rs_resource(const asn1::rrc_nr::zp_csi_rs_res_s& zp_csi_rs_ bool make_phy_nzp_csi_rs_resource(const asn1::rrc_nr::nzp_csi_rs_res_s& nzp_csi_rs_res, srsran_csi_rs_nzp_resource_t* csi_rs_nzp_resource); bool make_phy_carrier_cfg(const asn1::rrc_nr::freq_info_dl_s& freq_info_dl, srsran_carrier_nr_t* carrier_nr); +bool fill_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, + const asn1::rrc_nr::serving_cell_cfg_common_sib_s& serv_cell_cfg, + phy_cfg_nr_t::ssb_cfg_t* out_ssb); +void fill_ssb_pos_in_burst(const asn1::rrc_nr::serving_cell_cfg_common_sib_s& ssb_pos, + phy_cfg_nr_t::ssb_cfg_t* out_ssb); +bool fill_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, + const asn1::rrc_nr::serving_cell_cfg_common_sib_s& serv_cell_cfg, + srsran_ssb_cfg_t* out_ssb); bool make_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg, phy_cfg_nr_t::ssb_cfg_t* ssb); diff --git a/lib/src/asn1/rrc_nr_utils.cc b/lib/src/asn1/rrc_nr_utils.cc index bb6c0ee8b..c48c41706 100644 --- a/lib/src/asn1/rrc_nr_utils.cc +++ b/lib/src/asn1/rrc_nr_utils.cc @@ -1494,6 +1494,91 @@ static inline void make_ssb_positions_in_burst(const bitstring_t& } } +void fill_ssb_pos_in_burst(const asn1::rrc_nr::serving_cell_cfg_common_sib_s& cfg, phy_cfg_nr_t::ssb_cfg_t* out_ssb) +{ + auto& ssb_pos = cfg.ssb_positions_in_burst; + + out_ssb->position_in_burst = {}; + uint32_t N = ssb_pos.in_one_group.length(); + for (uint32_t i = 0; i < N; ++i) { + out_ssb->position_in_burst[i] = ssb_pos.in_one_group.get(i); + } + if (ssb_pos.group_presence_present) { + for (uint32_t i = 1; i < ssb_pos.group_presence.length(); ++i) { + if (ssb_pos.group_presence.get(i)) { + std::copy(out_ssb->position_in_burst.begin(), + out_ssb->position_in_burst.begin() + N, + out_ssb->position_in_burst.begin() + i * N); + } + } + } +} + +bool fill_ssb_pattern_scs(const srsran_carrier_nr_t& carrier, + srsran_ssb_patern_t* pattern, + srsran_subcarrier_spacing_t* ssb_scs) +{ + srsran::srsran_band_helper bands; + uint16_t band = bands.get_band_from_dl_freq_Hz(carrier.ssb_center_freq_hz); + if (band == UINT16_MAX) { + asn1::log_error("Invalid band for SSB frequency %.3f MHz", carrier.ssb_center_freq_hz); + return false; + } + + // TODO: Generalize conversion for other SCS + *pattern = bands.get_ssb_pattern(band, srsran_subcarrier_spacing_15kHz); + if (*pattern == SRSRAN_SSB_PATTERN_A) { + *ssb_scs = carrier.scs; + } else { + // try to optain SSB pattern for same band with 30kHz SCS + *pattern = bands.get_ssb_pattern(band, srsran_subcarrier_spacing_30kHz); + if (*pattern == SRSRAN_SSB_PATTERN_B || *pattern == SRSRAN_SSB_PATTERN_C) { + // SSB SCS is 30 kHz + *ssb_scs = srsran_subcarrier_spacing_30kHz; + } else { + asn1::log_error("Can't derive SSB pattern from band %d", band); + return false; + } + } + return true; +} + +bool fill_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, + const asn1::rrc_nr::serving_cell_cfg_common_sib_s& serv_cell_cfg, + srsran_ssb_cfg_t* out_ssb) +{ + *out_ssb = {}; + + out_ssb->center_freq_hz = carrier.dl_center_frequency_hz; + out_ssb->ssb_freq_hz = carrier.ssb_center_freq_hz; + if (not fill_ssb_pattern_scs(carrier, &out_ssb->pattern, &out_ssb->scs)) { + return false; + } + + out_ssb->duplex_mode = SRSRAN_DUPLEX_MODE_FDD; + if (serv_cell_cfg.tdd_ul_dl_cfg_common_present) { + out_ssb->duplex_mode = SRSRAN_DUPLEX_MODE_TDD; + } + + out_ssb->periodicity_ms = serv_cell_cfg.ssb_periodicity_serving_cell.to_number(); + return true; +} + +// SA case +bool fill_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, + const asn1::rrc_nr::serving_cell_cfg_common_sib_s& serv_cell_cfg, + phy_cfg_nr_t::ssb_cfg_t* out_ssb) +{ + // Derive SSB pattern and SCS + if (not fill_ssb_pattern_scs(carrier, &out_ssb->pattern, &out_ssb->scs)) { + return false; + } + fill_ssb_pos_in_burst(serv_cell_cfg, out_ssb); + out_ssb->periodicity_ms = (uint32_t)serv_cell_cfg.ssb_periodicity_serving_cell.to_number(); + + return true; +} + bool make_phy_ssb_cfg(const srsran_carrier_nr_t& carrier, const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg, phy_cfg_nr_t::ssb_cfg_t* out_ssb) diff --git a/srsgnb/hdr/stack/rrc/rrc_nr_config.h b/srsgnb/hdr/stack/rrc/rrc_nr_config.h index 0bf40b583..5312f6b5b 100644 --- a/srsgnb/hdr/stack/rrc/rrc_nr_config.h +++ b/srsgnb/hdr/stack/rrc/rrc_nr_config.h @@ -21,15 +21,6 @@ namespace srsenb { -// TODO: Make this common to NR and LTE -struct rrc_nr_cfg_sr_t { - uint32_t period; - // asn1::rrc::sched_request_cfg_c::setup_s_::dsr_trans_max_e_ dsr_max; - uint32_t nof_prb; - uint32_t sf_mapping[80]; - uint32_t nof_subframes; -}; - // Cell/Sector configuration for NR cells struct rrc_cell_cfg_nr_t { phy_cell_cfg_nr_t phy_cell; // already contains all PHY-related parameters (i.e. RF port, PCI, etc.) @@ -50,8 +41,6 @@ struct rrc_cell_cfg_nr_t { typedef std::vector rrc_cell_list_nr_t; struct rrc_nr_cfg_t { - rrc_nr_cfg_sr_t sr_cfg; - rrc_cfg_cqi_t cqi_cfg; rrc_cell_list_nr_t cell_list; uint32_t inactivity_timeout_ms = 100000; uint32_t enb_id; diff --git a/srsgnb/src/stack/rrc/rrc_nr.cc b/srsgnb/src/stack/rrc/rrc_nr.cc index 160637b4c..b7a0afc8d 100644 --- a/srsgnb/src/stack/rrc/rrc_nr.cc +++ b/srsgnb/src/stack/rrc/rrc_nr.cc @@ -76,9 +76,9 @@ int rrc_nr::init(const rrc_nr_cfg_t& cfg_, } // Generate cell config structs - cell_ctxt.reset(new cell_ctxt_t()); - std::unique_ptr master_cell_group{new cell_group_cfg_s()}; - int ret = fill_master_cell_cfg_from_enb_cfg(cfg, 0, *master_cell_group); + cell_ctxt = std::make_unique(); + std::unique_ptr master_cell_group = std::make_unique(); + int ret = fill_master_cell_cfg_from_enb_cfg(cfg, 0, *master_cell_group); srsran_assert(ret == SRSRAN_SUCCESS, "Failed to configure MasterCellGroup"); cell_ctxt->master_cell_group = std::move(master_cell_group); @@ -175,15 +175,14 @@ int rrc_nr::add_user(uint16_t rnti, uint32_t pcell_cc_idx, bool start_msg3_timer { if (users.contains(rnti) == 0) { // If in the ue ctor, "start_msg3_timer" is set to true, this will start the MSG3 RX TIMEOUT at ue creation - users.insert(rnti, std::unique_ptr(new ue(this, rnti, pcell_cc_idx, start_msg3_timer))); + users.insert(rnti, std::make_unique(this, rnti, pcell_cc_idx, start_msg3_timer)); rlc->add_user(rnti); pdcp->add_user(rnti); logger.info("Added new user rnti=0x%x", rnti); return SRSRAN_SUCCESS; - } else { - logger.error("Adding user rnti=0x%x (already exists)", rnti); - return SRSRAN_ERROR; } + logger.error("Adding user rnti=0x%x (already exists)", rnti); + return SRSRAN_ERROR; } /* @brief PUBLIC function, gets called by mac_nr::rach_detected @@ -277,13 +276,9 @@ void rrc_nr::config_phy() common_cfg.pdcch = cfg.cell_list[0].phy_cell.pdcch; common_cfg.prach = cfg.cell_list[0].phy_cell.prach; common_cfg.duplex_mode = cfg.cell_list[0].duplex_mode; - common_cfg.ssb = {}; - common_cfg.ssb.center_freq_hz = cfg.cell_list[0].phy_cell.dl_freq_hz; - common_cfg.ssb.ssb_freq_hz = cfg.cell_list[0].ssb_freq_hz; - common_cfg.ssb.scs = cfg.cell_list[0].ssb_scs; - common_cfg.ssb.pattern = cfg.cell_list[0].ssb_pattern; - common_cfg.ssb.duplex_mode = cfg.cell_list[0].duplex_mode; - common_cfg.ssb.periodicity_ms = du_cfg->cell(0).serv_cell_cfg_common().ssb_periodicity_serving_cell.to_number(); + bool ret = srsran::fill_phy_ssb_cfg( + cfg.cell_list[0].phy_cell.carrier, du_cfg->cell(0).serv_cell_cfg_common(), &common_cfg.ssb); + srsran_assert(ret, "Failed to generate PHY config"); if (phy->set_common_cfg(common_cfg) < SRSRAN_SUCCESS) { logger.error("Couldn't set common PHY config"); return; @@ -322,17 +317,14 @@ void rrc_nr::config_mac() bool valid_cfg = srsran::make_pdsch_cfg_from_serv_cell(cell_ctxt->master_cell_group->sp_cell_cfg.sp_cell_cfg_ded, &cell.bwps[0].pdsch); srsran_assert(valid_cfg, "Invalid NR cell configuration."); + cell.ssb_positions_in_burst = du_cfg->cell(cc).serv_cell_cfg_common().ssb_positions_in_burst; + cell.ssb_periodicity_ms = du_cfg->cell(cc).serv_cell_cfg_common().ssb_periodicity_serving_cell.to_number(); + cell.ssb_scs.value = (subcarrier_spacing_e::options)cfg.cell_list[0].phy_cell.carrier.scs; if (not cfg.is_standalone) { const serving_cell_cfg_common_s& serv_cell = cell_ctxt->master_cell_group->sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common; // Derive cell config from ASN1 - cell.ssb_positions_in_burst.in_one_group.set(0, true); - cell.ssb_periodicity_ms = serv_cell.ssb_periodicity_serving_cell.to_number(); - cell.ssb_scs = serv_cell.ssb_subcarrier_spacing; - } else { - cell.ssb_positions_in_burst = du_cfg->cell(cc).serv_cell_cfg_common().ssb_positions_in_burst; - cell.ssb_periodicity_ms = du_cfg->cell(cc).serv_cell_cfg_common().ssb_periodicity_serving_cell.to_number(); - cell.ssb_scs.value = (subcarrier_spacing_e::options)cfg.cell_list[0].phy_cell.carrier.scs; + cell.ssb_scs = serv_cell.ssb_subcarrier_spacing; } // Set SIB1 and SI messages @@ -367,7 +359,7 @@ int32_t rrc_nr::generate_sibs() // SI messages packing cell_ctxt->sibs.resize(1); sib2_s& sib2 = cell_ctxt->sibs[0].set_sib2(); - sib2.cell_resel_info_common.q_hyst.value = asn1::rrc_nr::sib2_s::cell_resel_info_common_s_::q_hyst_opts::db5; + sib2.cell_resel_info_common.q_hyst.value = sib2_s::cell_resel_info_common_s_::q_hyst_opts::db5; // msg is array of SI messages, each SI message msg[i] may contain multiple SIBs // all SIBs in a SI message msg[i] share the same periodicity