mirror of https://github.com/PentHertz/srsLTE.git
rrc,gnb: remove uneeded flat phy cfg fields from rrc_nr_cfg_t
This commit is contained in:
parent
301848002f
commit
88a95e8e57
|
@ -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,
|
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);
|
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 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,
|
bool make_phy_ssb_cfg(const srsran_carrier_nr_t& carrier,
|
||||||
const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg,
|
const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg,
|
||||||
phy_cfg_nr_t::ssb_cfg_t* ssb);
|
phy_cfg_nr_t::ssb_cfg_t* ssb);
|
||||||
|
|
|
@ -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,
|
bool make_phy_ssb_cfg(const srsran_carrier_nr_t& carrier,
|
||||||
const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg,
|
const asn1::rrc_nr::serving_cell_cfg_common_s& serv_cell_cfg,
|
||||||
phy_cfg_nr_t::ssb_cfg_t* out_ssb)
|
phy_cfg_nr_t::ssb_cfg_t* out_ssb)
|
||||||
|
|
|
@ -21,15 +21,6 @@
|
||||||
|
|
||||||
namespace srsenb {
|
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
|
// Cell/Sector configuration for NR cells
|
||||||
struct rrc_cell_cfg_nr_t {
|
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.)
|
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;
|
typedef std::vector<rrc_cell_cfg_nr_t> rrc_cell_list_nr_t;
|
||||||
|
|
||||||
struct rrc_nr_cfg_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;
|
rrc_cell_list_nr_t cell_list;
|
||||||
uint32_t inactivity_timeout_ms = 100000;
|
uint32_t inactivity_timeout_ms = 100000;
|
||||||
uint32_t enb_id;
|
uint32_t enb_id;
|
||||||
|
|
|
@ -76,9 +76,9 @@ int rrc_nr::init(const rrc_nr_cfg_t& cfg_,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate cell config structs
|
// Generate cell config structs
|
||||||
cell_ctxt.reset(new cell_ctxt_t());
|
cell_ctxt = std::make_unique<cell_ctxt_t>();
|
||||||
std::unique_ptr<cell_group_cfg_s> master_cell_group{new cell_group_cfg_s()};
|
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);
|
int ret = fill_master_cell_cfg_from_enb_cfg(cfg, 0, *master_cell_group);
|
||||||
srsran_assert(ret == SRSRAN_SUCCESS, "Failed to configure MasterCellGroup");
|
srsran_assert(ret == SRSRAN_SUCCESS, "Failed to configure MasterCellGroup");
|
||||||
cell_ctxt->master_cell_group = std::move(master_cell_group);
|
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 (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
|
// 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);
|
rlc->add_user(rnti);
|
||||||
pdcp->add_user(rnti);
|
pdcp->add_user(rnti);
|
||||||
logger.info("Added new user rnti=0x%x", rnti);
|
logger.info("Added new user rnti=0x%x", rnti);
|
||||||
return SRSRAN_SUCCESS;
|
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
|
/* @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.pdcch = cfg.cell_list[0].phy_cell.pdcch;
|
||||||
common_cfg.prach = cfg.cell_list[0].phy_cell.prach;
|
common_cfg.prach = cfg.cell_list[0].phy_cell.prach;
|
||||||
common_cfg.duplex_mode = cfg.cell_list[0].duplex_mode;
|
common_cfg.duplex_mode = cfg.cell_list[0].duplex_mode;
|
||||||
common_cfg.ssb = {};
|
bool ret = srsran::fill_phy_ssb_cfg(
|
||||||
common_cfg.ssb.center_freq_hz = cfg.cell_list[0].phy_cell.dl_freq_hz;
|
cfg.cell_list[0].phy_cell.carrier, du_cfg->cell(0).serv_cell_cfg_common(), &common_cfg.ssb);
|
||||||
common_cfg.ssb.ssb_freq_hz = cfg.cell_list[0].ssb_freq_hz;
|
srsran_assert(ret, "Failed to generate PHY config");
|
||||||
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();
|
|
||||||
if (phy->set_common_cfg(common_cfg) < SRSRAN_SUCCESS) {
|
if (phy->set_common_cfg(common_cfg) < SRSRAN_SUCCESS) {
|
||||||
logger.error("Couldn't set common PHY config");
|
logger.error("Couldn't set common PHY config");
|
||||||
return;
|
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,
|
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);
|
&cell.bwps[0].pdsch);
|
||||||
srsran_assert(valid_cfg, "Invalid NR cell configuration.");
|
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) {
|
if (not cfg.is_standalone) {
|
||||||
const serving_cell_cfg_common_s& serv_cell =
|
const serving_cell_cfg_common_s& serv_cell =
|
||||||
cell_ctxt->master_cell_group->sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common;
|
cell_ctxt->master_cell_group->sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common;
|
||||||
// Derive cell config from ASN1
|
// Derive cell config from ASN1
|
||||||
cell.ssb_positions_in_burst.in_one_group.set(0, true);
|
cell.ssb_scs = serv_cell.ssb_subcarrier_spacing;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set SIB1 and SI messages
|
// Set SIB1 and SI messages
|
||||||
|
@ -367,7 +359,7 @@ int32_t rrc_nr::generate_sibs()
|
||||||
// SI messages packing
|
// SI messages packing
|
||||||
cell_ctxt->sibs.resize(1);
|
cell_ctxt->sibs.resize(1);
|
||||||
sib2_s& sib2 = cell_ctxt->sibs[0].set_sib2();
|
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
|
// 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
|
// all SIBs in a SI message msg[i] share the same periodicity
|
||||||
|
|
Loading…
Reference in New Issue