rrc,gnb: remove uneeded flat phy cfg fields from rrc_nr_cfg_t

This commit is contained in:
Francisco Paisana 2022-02-04 13:12:37 +00:00
parent 301848002f
commit 88a95e8e57
4 changed files with 107 additions and 33 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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_cfg_nr_t> 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;

View File

@ -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<cell_group_cfg_s> 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<cell_ctxt_t>();
std::unique_ptr<cell_group_cfg_s> master_cell_group = std::make_unique<cell_group_cfg_s>();
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<ue>(new ue(this, rnti, pcell_cc_idx, start_msg3_timer)));
users.insert(rnti, std::make_unique<ue>(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