rrc,nr: create DU configuration manager in RRC NR class to handle the generation of SIBs and other cell-specific parameters

This commit is contained in:
Francisco 2022-01-21 12:40:29 +00:00 committed by Francisco Paisana
parent 12cc7cb4d7
commit ab9fe90d3a
10 changed files with 235 additions and 85 deletions

View File

@ -83,8 +83,8 @@ struct sched_nr_cell_cfg_t {
uint32_t pci; uint32_t pci;
uint32_t dl_cell_nof_prb; uint32_t dl_cell_nof_prb;
uint32_t ul_cell_nof_prb; uint32_t ul_cell_nof_prb;
asn1::copy_ptr<asn1::rrc_nr::dl_cfg_common_sib_s> dl_cfg_common; asn1::rrc_nr::dl_cfg_common_sib_s dl_cfg_common;
asn1::copy_ptr<asn1::rrc_nr::ul_cfg_common_sib_s> ul_cfg_common; asn1::rrc_nr::ul_cfg_common_sib_s ul_cfg_common;
srsran::optional<asn1::rrc_nr::tdd_ul_dl_cfg_common_s> tdd_ul_dl_cfg_common; srsran::optional<asn1::rrc_nr::tdd_ul_dl_cfg_common_s> tdd_ul_dl_cfg_common;
ssb_positions_in_burst_t ssb_positions_in_burst; ssb_positions_in_burst_t ssb_positions_in_burst;
uint32_t ssb_periodicity_ms = 0; uint32_t ssb_periodicity_ms = 0;
@ -98,8 +98,6 @@ struct sched_nr_cell_cfg_t {
double dl_center_frequency_hz; double dl_center_frequency_hz;
double ul_center_frequency_hz; double ul_center_frequency_hz;
double ssb_center_freq_hz; double ssb_center_freq_hz;
uint32_t offset_to_carrier;
srsran_subcarrier_spacing_t scs;
}; };
class sched_nr_interface class sched_nr_interface

View File

@ -37,6 +37,7 @@
namespace srsenb { namespace srsenb {
class enb_bearer_manager; class enb_bearer_manager;
class du_config_manager;
enum class rrc_nr_state_t { RRC_IDLE, RRC_INACTIVE, RRC_CONNECTED }; enum class rrc_nr_state_t { RRC_IDLE, RRC_INACTIVE, RRC_CONNECTED };
@ -142,8 +143,8 @@ private:
asn1::rrc_nr::sp_cell_cfg_s base_sp_cell_cfg; asn1::rrc_nr::sp_cell_cfg_s base_sp_cell_cfg;
// vars // vars
std::unique_ptr<du_config_manager> du_cfg;
struct cell_ctxt_t { struct cell_ctxt_t {
asn1::rrc_nr::mib_s mib;
asn1::rrc_nr::sib1_s sib1; asn1::rrc_nr::sib1_s sib1;
asn1::rrc_nr::sys_info_ies_s::sib_type_and_info_l_ sibs; asn1::rrc_nr::sys_info_ies_s::sib_type_and_info_l_ sibs;
srsran::unique_byte_buffer_t mib_buffer = nullptr; srsran::unique_byte_buffer_t mib_buffer = nullptr;

View File

@ -0,0 +1,62 @@
/**
*
* \section COPYRIGHT
*
* Copyright 2013-2021 Software Radio Systems Limited
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the distribution.
*
*/
#ifndef SRSRAN_RRC_NR_DU_MANAGER_H
#define SRSRAN_RRC_NR_DU_MANAGER_H
#include "rrc_nr_config.h"
#include "srsgnb/hdr/stack/mac/sched_nr_interface.h"
#include "srsran/asn1/rrc_nr.h"
namespace srsenb {
class du_cell_config
{
public:
uint32_t cc;
uint32_t pci;
asn1::rrc_nr::mib_s mib;
srsran::unique_byte_buffer_t packed_mib;
asn1::rrc_nr::sib1_s sib1;
srsran::unique_byte_buffer_t packed_sib1;
/// SI messages (index=0 for SIB1)
srsran::const_byte_span packed_si_msg(uint32_t idx) { return srsran::make_span(packed_sib1); }
size_t nof_si_msgs() const { return 1; }
};
class du_config_manager
{
public:
du_config_manager(const rrc_nr_cfg_t& cfg);
~du_config_manager();
int add_cell();
const du_cell_config& cell(uint32_t cc) const
{
srsran_assert(cc < cells.size(), "Unknown DU Cell Index=%d", cc);
return *cells[cc];
}
private:
const rrc_nr_cfg_t& cfg;
srslog::basic_logger& logger;
std::vector<std::unique_ptr<du_cell_config> > cells;
};
} // namespace srsenb
#endif // SRSRAN_RRC_NR_DU_MANAGER_H

View File

@ -140,15 +140,11 @@ cell_config_manager::cell_config_manager(uint32_t cc_,
carrier.dl_center_frequency_hz = cell.dl_center_frequency_hz; carrier.dl_center_frequency_hz = cell.dl_center_frequency_hz;
carrier.ul_center_frequency_hz = cell.ul_center_frequency_hz; carrier.ul_center_frequency_hz = cell.ul_center_frequency_hz;
carrier.ssb_center_freq_hz = cell.ssb_center_freq_hz; carrier.ssb_center_freq_hz = cell.ssb_center_freq_hz;
carrier.offset_to_carrier = cell.offset_to_carrier;
carrier.scs = cell.scs;
carrier.nof_prb = cell.dl_cell_nof_prb; carrier.nof_prb = cell.dl_cell_nof_prb;
carrier.start = 0; // TODO: Check carrier.start = 0; // TODO: Check
carrier.max_mimo_layers = cell.nof_layers; carrier.max_mimo_layers = cell.nof_layers;
if (cell.dl_cfg_common.is_present()) { carrier.offset_to_carrier = cell.dl_cfg_common.freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier;
carrier.offset_to_carrier = cell.dl_cfg_common->freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier; carrier.scs = (srsran_subcarrier_spacing_t)cell.dl_cfg_common.init_dl_bwp.generic_params.subcarrier_spacing.value;
carrier.scs = (srsran_subcarrier_spacing_t)cell.dl_cfg_common->init_dl_bwp.generic_params.subcarrier_spacing.value;
}
// TDD-UL-DL-ConfigCommon // TDD-UL-DL-ConfigCommon
duplex.mode = SRSRAN_DUPLEX_MODE_FDD; duplex.mode = SRSRAN_DUPLEX_MODE_FDD;

View File

@ -25,9 +25,9 @@ uint32_t coreset_nof_cces(const srsran_coreset_t& coreset)
void make_mib_cfg(const sched_nr_cell_cfg_t& cfg, srsran_mib_nr_t* mib) void make_mib_cfg(const sched_nr_cell_cfg_t& cfg, srsran_mib_nr_t* mib)
{ {
*mib = {}; *mib = {};
mib->scs_common = cfg.scs; mib->scs_common = (srsran_subcarrier_spacing_t)cfg.dl_cfg_common.init_dl_bwp.generic_params.subcarrier_spacing.value;
mib->ssb_offset = 6; // TODO mib->ssb_offset = 6; // TODO
mib->dmrs_typeA_pos = (srsran_dmrs_sch_typeA_pos_t)cfg.dmrs_type_a_position.value; mib->dmrs_typeA_pos = (srsran_dmrs_sch_typeA_pos_t)cfg.dmrs_type_a_position.value;
mib->coreset0_idx = cfg.pdcch_cfg_sib1.ctrl_res_set_zero; mib->coreset0_idx = cfg.pdcch_cfg_sib1.ctrl_res_set_zero;
mib->ss0_idx = cfg.pdcch_cfg_sib1.search_space_zero; mib->ss0_idx = cfg.pdcch_cfg_sib1.search_space_zero;
@ -53,12 +53,10 @@ void make_ssb_cfg(const sched_nr_cell_cfg_t& cfg, srsran::phy_cfg_nr_t::ssb_cfg_
} }
ssb->scs = (srsran_subcarrier_spacing_t)cfg.ssb_scs.value; ssb->scs = (srsran_subcarrier_spacing_t)cfg.ssb_scs.value;
ssb->pattern = SRSRAN_SSB_PATTERN_A; ssb->pattern = SRSRAN_SSB_PATTERN_A;
if (cfg.dl_cfg_common.is_present()) { if (cfg.dl_cfg_common.freq_info_dl.freq_band_list.size() > 0 and
if (cfg.dl_cfg_common->freq_info_dl.freq_band_list.size() > 0 and cfg.dl_cfg_common.freq_info_dl.freq_band_list[0].freq_band_ind_nr_present) {
cfg.dl_cfg_common->freq_info_dl.freq_band_list[0].freq_band_ind_nr_present) { uint32_t band = cfg.dl_cfg_common.freq_info_dl.freq_band_list[0].freq_band_ind_nr;
uint32_t band = cfg.dl_cfg_common->freq_info_dl.freq_band_list[0].freq_band_ind_nr; ssb->pattern = srsran::srsran_band_helper::get_ssb_pattern(band, ssb->scs);
ssb->pattern = srsran::srsran_band_helper::get_ssb_pattern(band, ssb->scs);
}
} }
} }
@ -84,10 +82,11 @@ srsran::phy_cfg_nr_t get_common_ue_phy_cfg(const sched_nr_cell_cfg_t& cfg)
ue_phy_cfg.carrier.dl_center_frequency_hz = cfg.dl_center_frequency_hz; ue_phy_cfg.carrier.dl_center_frequency_hz = cfg.dl_center_frequency_hz;
ue_phy_cfg.carrier.ul_center_frequency_hz = cfg.ul_center_frequency_hz; ue_phy_cfg.carrier.ul_center_frequency_hz = cfg.ul_center_frequency_hz;
ue_phy_cfg.carrier.ssb_center_freq_hz = cfg.ssb_center_freq_hz; ue_phy_cfg.carrier.ssb_center_freq_hz = cfg.ssb_center_freq_hz;
ue_phy_cfg.carrier.offset_to_carrier = cfg.offset_to_carrier; ue_phy_cfg.carrier.offset_to_carrier = cfg.dl_cfg_common.freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier;
ue_phy_cfg.carrier.scs = cfg.scs; ue_phy_cfg.carrier.scs =
ue_phy_cfg.carrier.nof_prb = cfg.dl_cell_nof_prb; (srsran_subcarrier_spacing_t)cfg.dl_cfg_common.init_dl_bwp.generic_params.subcarrier_spacing.value;
ue_phy_cfg.carrier.max_mimo_layers = cfg.nof_layers; ue_phy_cfg.carrier.nof_prb = cfg.dl_cell_nof_prb;
ue_phy_cfg.carrier.max_mimo_layers = cfg.nof_layers;
make_ssb_cfg(cfg, &ue_phy_cfg.ssb); make_ssb_cfg(cfg, &ue_phy_cfg.ssb);
// remove UE-specific SearchSpaces (they will be added later via RRC) // remove UE-specific SearchSpaces (they will be added later via RRC)

View File

@ -53,11 +53,16 @@ inline sched_nr_cell_cfg_t get_default_cell_cfg(const srsran::phy_cfg_nr_t& phy_
cell_cfg.dl_center_frequency_hz = phy_cfg.carrier.dl_center_frequency_hz; cell_cfg.dl_center_frequency_hz = phy_cfg.carrier.dl_center_frequency_hz;
cell_cfg.ul_center_frequency_hz = phy_cfg.carrier.ul_center_frequency_hz; cell_cfg.ul_center_frequency_hz = phy_cfg.carrier.ul_center_frequency_hz;
cell_cfg.ssb_center_freq_hz = phy_cfg.carrier.ssb_center_freq_hz; cell_cfg.ssb_center_freq_hz = phy_cfg.carrier.ssb_center_freq_hz;
cell_cfg.offset_to_carrier = phy_cfg.carrier.offset_to_carrier; cell_cfg.dl_cfg_common.freq_info_dl.scs_specific_carrier_list.resize(1);
cell_cfg.scs = phy_cfg.carrier.scs; cell_cfg.dl_cfg_common.freq_info_dl.scs_specific_carrier_list[0].subcarrier_spacing =
cell_cfg.dl_cell_nof_prb = phy_cfg.carrier.nof_prb; (asn1::rrc_nr::subcarrier_spacing_opts::options)phy_cfg.carrier.scs;
cell_cfg.nof_layers = phy_cfg.carrier.max_mimo_layers; cell_cfg.dl_cfg_common.freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier =
cell_cfg.ssb_periodicity_ms = phy_cfg.ssb.periodicity_ms; phy_cfg.carrier.offset_to_carrier;
cell_cfg.dl_cfg_common.init_dl_bwp.generic_params.subcarrier_spacing =
(asn1::rrc_nr::subcarrier_spacing_opts::options)phy_cfg.carrier.scs;
cell_cfg.dl_cell_nof_prb = phy_cfg.carrier.nof_prb;
cell_cfg.nof_layers = phy_cfg.carrier.max_mimo_layers;
cell_cfg.ssb_periodicity_ms = phy_cfg.ssb.periodicity_ms;
for (uint32_t i = 0; i < cell_cfg.ssb_positions_in_burst.in_one_group.length(); ++i) { for (uint32_t i = 0; i < cell_cfg.ssb_positions_in_burst.in_one_group.length(); ++i) {
cell_cfg.ssb_positions_in_burst.in_one_group.set(i, phy_cfg.ssb.position_in_burst[i]); cell_cfg.ssb_positions_in_burst.in_one_group.set(i, phy_cfg.ssb.position_in_burst[i]);
} }

View File

@ -10,7 +10,7 @@ set(SOURCES rrc_nr_config_utils.cc)
add_library(srsgnb_rrc_config_utils STATIC ${SOURCES}) add_library(srsgnb_rrc_config_utils STATIC ${SOURCES})
target_link_libraries(srsgnb_rrc_config_utils srsran_phy) target_link_libraries(srsgnb_rrc_config_utils srsran_phy)
set(SOURCES rrc_nr.cc rrc_nr_ue.cc rrc_nr_security_context.cc cell_asn1_config.cc) set(SOURCES rrc_nr.cc rrc_nr_ue.cc rrc_nr_security_context.cc cell_asn1_config.cc rrc_nr_du_manager.cc)
add_library(srsgnb_rrc STATIC ${SOURCES}) add_library(srsgnb_rrc STATIC ${SOURCES})
target_link_libraries(srsgnb_rrc srsgnb_rrc_config_utils) target_link_libraries(srsgnb_rrc srsgnb_rrc_config_utils)

View File

@ -122,6 +122,18 @@ void set_rach_cfg_common(const srsran_prach_cfg_t& prach_cfg, asn1::rrc_nr::rach
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void fill_tdd_ul_dl_config_common(const rrc_cell_cfg_nr_t& cfg, asn1::rrc_nr::tdd_ul_dl_cfg_common_s& tdd)
{
srsran_assert(cfg.duplex_mode == SRSRAN_DUPLEX_MODE_TDD, "This function should only be called for TDD configs");
// TDD UL-DL config
tdd.ref_subcarrier_spacing.value = (asn1::rrc_nr::subcarrier_spacing_opts::options)cfg.phy_cell.carrier.scs;
tdd.pattern1.dl_ul_tx_periodicity = asn1::rrc_nr::tdd_ul_dl_pattern_s::dl_ul_tx_periodicity_opts::ms10;
tdd.pattern1.nrof_dl_slots = 6;
tdd.pattern1.nrof_dl_symbols = 0;
tdd.pattern1.nrof_ul_slots = 4;
tdd.pattern1.nrof_ul_symbols = 0;
}
/// Fill list of CSI-ReportConfig with gNB config /// Fill list of CSI-ReportConfig with gNB config
int fill_csi_report_from_enb_cfg(const rrc_nr_cfg_t& cfg, csi_meas_cfg_s& csi_meas_cfg) int fill_csi_report_from_enb_cfg(const rrc_nr_cfg_t& cfg, csi_meas_cfg_s& csi_meas_cfg)
{ {
@ -888,13 +900,7 @@ int fill_serv_cell_common_from_enb_cfg(const rrc_nr_cfg_t& cfg, uint32_t cc, ser
if (cfg.cell_list[cc].duplex_mode == SRSRAN_DUPLEX_MODE_TDD) { if (cfg.cell_list[cc].duplex_mode == SRSRAN_DUPLEX_MODE_TDD) {
// TDD UL-DL config // TDD UL-DL config
serv_common.tdd_ul_dl_cfg_common_present = true; serv_common.tdd_ul_dl_cfg_common_present = true;
auto& tdd_config = serv_common.tdd_ul_dl_cfg_common; fill_tdd_ul_dl_config_common(cfg.cell_list[cc], serv_common.tdd_ul_dl_cfg_common);
tdd_config.ref_subcarrier_spacing = subcarrier_spacing_e::khz15;
tdd_config.pattern1.dl_ul_tx_periodicity = asn1::rrc_nr::tdd_ul_dl_pattern_s::dl_ul_tx_periodicity_opts::ms10;
tdd_config.pattern1.nrof_dl_slots = 6;
tdd_config.pattern1.nrof_dl_symbols = 0;
tdd_config.pattern1.nrof_ul_slots = 4;
tdd_config.pattern1.nrof_ul_symbols = 0;
} }
serv_common.ul_cfg_common_present = true; serv_common.ul_cfg_common_present = true;
@ -1135,7 +1141,7 @@ void fill_dl_cfg_common_sib(const rrc_cell_cfg_nr_t& cell_cfg, dl_cfg_common_sib
uint32_t offset_point_a_prbs = offset_point_a_hz / prb_bw; uint32_t offset_point_a_prbs = offset_point_a_hz / prb_bw;
cfg.freq_info_dl.offset_to_point_a = offset_point_a_prbs; cfg.freq_info_dl.offset_to_point_a = offset_point_a_prbs;
cfg.freq_info_dl.scs_specific_carrier_list.resize(1); cfg.freq_info_dl.scs_specific_carrier_list.resize(1);
cfg.freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier = 0; cfg.freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier = cell_cfg.phy_cell.carrier.offset_to_carrier;
cfg.freq_info_dl.scs_specific_carrier_list[0].subcarrier_spacing = cfg.freq_info_dl.scs_specific_carrier_list[0].subcarrier_spacing =
(subcarrier_spacing_opts::options)cell_cfg.phy_cell.carrier.scs; (subcarrier_spacing_opts::options)cell_cfg.phy_cell.carrier.scs;
cfg.freq_info_dl.scs_specific_carrier_list[0].carrier_bw = cell_cfg.phy_cell.carrier.nof_prb; cfg.freq_info_dl.scs_specific_carrier_list[0].carrier_bw = cell_cfg.phy_cell.carrier.nof_prb;
@ -1165,7 +1171,7 @@ void fill_ul_cfg_common_sib(const rrc_cell_cfg_nr_t& cell_cfg, ul_cfg_common_sib
band_helper.get_abs_freq_point_a_arfcn(cell_cfg.phy_cell.carrier.nof_prb, cell_cfg.ul_arfcn); band_helper.get_abs_freq_point_a_arfcn(cell_cfg.phy_cell.carrier.nof_prb, cell_cfg.ul_arfcn);
cfg.freq_info_ul.scs_specific_carrier_list.resize(1); cfg.freq_info_ul.scs_specific_carrier_list.resize(1);
cfg.freq_info_ul.scs_specific_carrier_list[0].offset_to_carrier = 0; cfg.freq_info_ul.scs_specific_carrier_list[0].offset_to_carrier = cell_cfg.phy_cell.carrier.offset_to_carrier;
cfg.freq_info_ul.scs_specific_carrier_list[0].subcarrier_spacing = cfg.freq_info_ul.scs_specific_carrier_list[0].subcarrier_spacing =
(subcarrier_spacing_opts::options)cell_cfg.phy_cell.carrier.scs; (subcarrier_spacing_opts::options)cell_cfg.phy_cell.carrier.scs;
cfg.freq_info_ul.scs_specific_carrier_list[0].carrier_bw = cell_cfg.phy_cell.carrier.nof_prb; cfg.freq_info_ul.scs_specific_carrier_list[0].carrier_bw = cell_cfg.phy_cell.carrier.nof_prb;
@ -1212,6 +1218,12 @@ void fill_serv_cell_cfg_common_sib(const rrc_cell_cfg_nr_t& cell_cfg, serving_ce
cfg.ssb_periodicity_serving_cell.value = serving_cell_cfg_common_sib_s::ssb_periodicity_serving_cell_opts::ms20; cfg.ssb_periodicity_serving_cell.value = serving_cell_cfg_common_sib_s::ssb_periodicity_serving_cell_opts::ms20;
// TDD UL-DL config
if (cell_cfg.duplex_mode == SRSRAN_DUPLEX_MODE_TDD) {
cfg.tdd_ul_dl_cfg_common_present = true;
fill_tdd_ul_dl_config_common(cell_cfg, cfg.tdd_ul_dl_cfg_common);
}
cfg.ss_pbch_block_pwr = cell_cfg.phy_cell.pdsch.rs_power; cfg.ss_pbch_block_pwr = cell_cfg.phy_cell.pdsch.rs_power;
} }

View File

@ -14,6 +14,7 @@
#include "srsenb/hdr/common/common_enb.h" #include "srsenb/hdr/common/common_enb.h"
#include "srsgnb/hdr/stack/rrc/cell_asn1_config.h" #include "srsgnb/hdr/stack/rrc/cell_asn1_config.h"
#include "srsgnb/hdr/stack/rrc/rrc_nr_config_utils.h" #include "srsgnb/hdr/stack/rrc/rrc_nr_config_utils.h"
#include "srsgnb/hdr/stack/rrc/rrc_nr_du_manager.h"
#include "srsgnb/hdr/stack/rrc/rrc_nr_ue.h" #include "srsgnb/hdr/stack/rrc/rrc_nr_ue.h"
#include "srsgnb/src/stack/mac/test/sched_nr_cfg_generators.h" #include "srsgnb/src/stack/mac/test/sched_nr_cfg_generators.h"
#include "srsran/asn1/rrc_nr_utils.h" #include "srsran/asn1/rrc_nr_utils.h"
@ -68,6 +69,11 @@ int rrc_nr::init(const rrc_nr_cfg_t& cfg_,
cell.ssb_absolute_freq_point); cell.ssb_absolute_freq_point);
} }
du_cfg = std::make_unique<du_config_manager>(cfg);
for (uint32_t i = 0; i < cfg.cell_list.size(); ++i) {
du_cfg->add_cell();
}
// Generate cell config structs // Generate cell config structs
cell_ctxt.reset(new cell_ctxt_t{}); cell_ctxt.reset(new cell_ctxt_t{});
if (cfg.is_standalone) { if (cfg.is_standalone) {
@ -293,54 +299,49 @@ void rrc_nr::config_phy()
void rrc_nr::config_mac() void rrc_nr::config_mac()
{ {
uint32_t cc = 0;
// Fill MAC scheduler configuration for SIBs // Fill MAC scheduler configuration for SIBs
// TODO: use parsed cell NR cfg configuration // TODO: use parsed cell NR cfg configuration
srsran::phy_cfg_nr_default_t::reference_cfg_t ref_args{}; srsran::phy_cfg_nr_default_t::reference_cfg_t ref_args{};
ref_args.duplex = cfg.cell_list[0].duplex_mode == SRSRAN_DUPLEX_MODE_TDD ref_args.duplex = cfg.cell_list[cc].duplex_mode == SRSRAN_DUPLEX_MODE_TDD
? srsran::phy_cfg_nr_default_t::reference_cfg_t::R_DUPLEX_TDD_CUSTOM_6_4 ? srsran::phy_cfg_nr_default_t::reference_cfg_t::R_DUPLEX_TDD_CUSTOM_6_4
: srsran::phy_cfg_nr_default_t::reference_cfg_t::R_DUPLEX_FDD; : srsran::phy_cfg_nr_default_t::reference_cfg_t::R_DUPLEX_FDD;
std::vector<sched_nr_cell_cfg_t> sched_cells_cfg(1, get_default_cell_cfg(srsran::phy_cfg_nr_default_t{ref_args})); std::vector<sched_nr_cell_cfg_t> sched_cells_cfg(1, get_default_cell_cfg(srsran::phy_cfg_nr_default_t{ref_args}));
sched_nr_cell_cfg_t& cell = sched_cells_cfg[0]; sched_nr_cell_cfg_t& cell = sched_cells_cfg[cc];
// Derive cell config from rrc_nr_cfg_t // Derive cell config from rrc_nr_cfg_t
cell.bwps[0].pdcch = cfg.cell_list[0].phy_cell.pdcch; cell.bwps[0].pdcch = cfg.cell_list[cc].phy_cell.pdcch;
cell.pci = cfg.cell_list[0].phy_cell.carrier.pci; cell.pci = cfg.cell_list[cc].phy_cell.carrier.pci;
cell.nof_layers = cfg.cell_list[0].phy_cell.carrier.max_mimo_layers; cell.nof_layers = cfg.cell_list[cc].phy_cell.carrier.max_mimo_layers;
cell.dl_cell_nof_prb = cfg.cell_list[0].phy_cell.carrier.nof_prb; cell.dl_cell_nof_prb = cfg.cell_list[cc].phy_cell.carrier.nof_prb;
cell.ul_cell_nof_prb = cfg.cell_list[0].phy_cell.carrier.nof_prb; cell.ul_cell_nof_prb = cfg.cell_list[cc].phy_cell.carrier.nof_prb;
cell.dl_center_frequency_hz = cfg.cell_list[0].phy_cell.carrier.dl_center_frequency_hz; cell.dl_center_frequency_hz = cfg.cell_list[cc].phy_cell.carrier.dl_center_frequency_hz;
cell.ul_center_frequency_hz = cfg.cell_list[0].phy_cell.carrier.ul_center_frequency_hz; cell.ul_center_frequency_hz = cfg.cell_list[cc].phy_cell.carrier.ul_center_frequency_hz;
cell.ssb_center_freq_hz = cfg.cell_list[0].phy_cell.carrier.ssb_center_freq_hz; cell.ssb_center_freq_hz = cfg.cell_list[cc].phy_cell.carrier.ssb_center_freq_hz;
cell.offset_to_carrier = cfg.cell_list[0].phy_cell.carrier.offset_to_carrier; cell.dmrs_type_a_position = du_cfg->cell(cc).mib.dmrs_type_a_position;
cell.scs = cfg.cell_list[0].phy_cell.carrier.scs; cell.pdcch_cfg_sib1 = du_cfg->cell(cc).mib.pdcch_cfg_sib1;
if (du_cfg->cell(cc).sib1.serving_cell_cfg_common.tdd_ul_dl_cfg_common_present) {
cell.tdd_ul_dl_cfg_common.emplace(du_cfg->cell(cc).sib1.serving_cell_cfg_common.tdd_ul_dl_cfg_common);
}
cell.dl_cfg_common = du_cfg->cell(cc).sib1.serving_cell_cfg_common.dl_cfg_common;
cell.ul_cfg_common = du_cfg->cell(cc).sib1.serving_cell_cfg_common.ul_cfg_common;
cell.ss_pbch_block_power = du_cfg->cell(cc).sib1.serving_cell_cfg_common.ss_pbch_block_pwr;
if (not cfg.is_standalone) { if (not cfg.is_standalone) {
const serving_cell_cfg_common_s& serv_cell = base_sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common; const serving_cell_cfg_common_s& serv_cell = base_sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common;
// Derive cell config from ASN1 // Derive cell config from ASN1
bool valid_cfg = srsran::make_pdsch_cfg_from_serv_cell(base_sp_cell_cfg.sp_cell_cfg_ded, &cell.bwps[0].pdsch); bool valid_cfg = srsran::make_pdsch_cfg_from_serv_cell(base_sp_cell_cfg.sp_cell_cfg_ded, &cell.bwps[0].pdsch);
srsran_assert(valid_cfg, "Invalid NR cell configuration."); srsran_assert(valid_cfg, "Invalid NR cell configuration.");
if (serv_cell.tdd_ul_dl_cfg_common_present) {
cell.tdd_ul_dl_cfg_common.emplace(serv_cell.tdd_ul_dl_cfg_common);
}
cell.ssb_positions_in_burst.in_one_group.set(0, true); 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_periodicity_ms = serv_cell.ssb_periodicity_serving_cell.to_number();
cell.ssb_scs = serv_cell.ssb_subcarrier_spacing; cell.ssb_scs = serv_cell.ssb_subcarrier_spacing;
cell.ss_pbch_block_power = serv_cell.ss_pbch_block_pwr;
} else { } else {
const serving_cell_cfg_common_sib_s& serv_cell = cell_ctxt->sib1.serving_cell_cfg_common; const serving_cell_cfg_common_sib_s& serv_cell = cell_ctxt->sib1.serving_cell_cfg_common;
cell.bwps[0].pdsch.p_zp_csi_rs_set = {}; cell.bwps[0].pdsch.p_zp_csi_rs_set = {};
bzero(cell.bwps[0].pdsch.nzp_csi_rs_sets, sizeof(cell.bwps[0].pdsch.nzp_csi_rs_sets)); bzero(cell.bwps[0].pdsch.nzp_csi_rs_sets, sizeof(cell.bwps[0].pdsch.nzp_csi_rs_sets));
cell.dl_cfg_common.reset(new dl_cfg_common_sib_s{serv_cell.dl_cfg_common});
cell.ul_cfg_common.reset(new ul_cfg_common_sib_s{serv_cell.ul_cfg_common});
if (serv_cell.tdd_ul_dl_cfg_common_present) {
cell.tdd_ul_dl_cfg_common.emplace(serv_cell.tdd_ul_dl_cfg_common);
}
cell.ssb_positions_in_burst = serv_cell.ssb_positions_in_burst; cell.ssb_positions_in_burst = serv_cell.ssb_positions_in_burst;
cell.ssb_periodicity_ms = serv_cell.ssb_periodicity_serving_cell.to_number(); cell.ssb_periodicity_ms = serv_cell.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.value = (subcarrier_spacing_e::options)cfg.cell_list[0].phy_cell.carrier.scs;
cell.ss_pbch_block_power = serv_cell.ss_pbch_block_pwr;
} }
cell.dmrs_type_a_position = cell_ctxt->mib.dmrs_type_a_position;
cell.pdcch_cfg_sib1 = cell_ctxt->mib.pdcch_cfg_sib1;
// Set SIB1 and SI messages // Set SIB1 and SI messages
cell.sibs.resize(cell_ctxt->sib_buffer.size()); cell.sibs.resize(cell_ctxt->sib_buffer.size());
@ -364,26 +365,6 @@ void rrc_nr::config_mac()
int32_t rrc_nr::generate_sibs() int32_t rrc_nr::generate_sibs()
{ {
// MIB packing
fill_mib_from_enb_cfg(cfg.cell_list[0], cell_ctxt->mib);
bcch_bch_msg_s mib_msg;
mib_msg.msg.set_mib() = cell_ctxt->mib;
{
srsran::unique_byte_buffer_t mib_buf = srsran::make_byte_buffer();
if (mib_buf == nullptr) {
logger.error("Couldn't allocate PDU in %s().", __FUNCTION__);
return SRSRAN_ERROR;
}
asn1::bit_ref bref(mib_buf->msg, mib_buf->get_tailroom());
if (mib_msg.pack(bref) != asn1::SRSASN_SUCCESS) {
logger.error("Couldn't pack mib msg");
return SRSRAN_ERROR;
}
mib_buf->N_bytes = bref.distance_bytes();
logger.debug(mib_buf->msg, mib_buf->N_bytes, "MIB payload (%d B)", mib_buf->N_bytes);
cell_ctxt->mib_buffer = std::move(mib_buf);
}
if (not cfg.is_standalone) { if (not cfg.is_standalone) {
return SRSRAN_SUCCESS; return SRSRAN_SUCCESS;
} }

View File

@ -0,0 +1,96 @@
/**
*
* \section COPYRIGHT
*
* Copyright 2013-2021 Software Radio Systems Limited
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the distribution.
*
*/
#include "srsgnb/hdr/stack/rrc/rrc_nr_du_manager.h"
#include "srsgnb/hdr/stack/rrc/cell_asn1_config.h"
#include "srsran/common/string_helpers.h"
using namespace asn1::rrc_nr;
namespace srsenb {
du_config_manager::du_config_manager(const rrc_nr_cfg_t& cfg_) : cfg(cfg_), logger(srslog::fetch_basic_logger("RRC-NR"))
{}
du_config_manager::~du_config_manager() {}
int du_config_manager::add_cell()
{
// add cell
std::unique_ptr<du_cell_config> obj = std::make_unique<du_cell_config>();
du_cell_config& cell = *obj;
cell.cc = cells.size();
// Fill general cell params
cell.pci = cfg.cell_list[cell.cc].phy_cell.carrier.pci;
// fill MIB ASN.1
if (fill_mib_from_enb_cfg(cfg.cell_list[cell.cc], cell.mib) != SRSRAN_SUCCESS) {
return SRSRAN_ERROR;
}
// Pack MIB
cell.packed_mib = srsran::make_byte_buffer();
if (cell.packed_mib == nullptr) {
logger.error("Couldn't allocate PDU in %s().", __FUNCTION__);
return SRSRAN_ERROR;
}
{
asn1::bit_ref bref(cell.packed_mib->msg, cell.packed_mib->get_tailroom());
bcch_bch_msg_s bch_msg;
bch_msg.msg.set_mib() = cell.mib;
if (bch_msg.pack(bref) != asn1::SRSASN_SUCCESS) {
logger.error("Couldn't pack mib msg");
return SRSRAN_ERROR;
}
cell.packed_mib->N_bytes = bref.distance_bytes();
}
logger.info(
cell.packed_mib->data(), cell.packed_mib->size(), "BCCH-BCH Message (with MIB) (%d B)", cell.packed_mib->size());
asn1::json_writer js;
cell.mib.to_json(js);
logger.info("MIB content: %s", js.to_string().c_str());
// fill SIB1 ASN.1
if (fill_sib1_from_enb_cfg(cfg, cell.cc, cell.sib1) != SRSRAN_SUCCESS) {
logger.error("Couldn't generate SIB1");
return SRSRAN_ERROR;
}
// Pack SIB1
cell.packed_sib1 = srsran::make_byte_buffer();
if (cell.packed_sib1 == nullptr) {
logger.error("Couldn't allocate PDU in %s().", __FUNCTION__);
return SRSRAN_ERROR;
}
{
asn1::bit_ref bref(cell.packed_sib1->msg, cell.packed_sib1->get_tailroom());
bcch_dl_sch_msg_s bcch_msg;
bcch_msg.msg.set_c1().set_sib_type1() = cell.sib1;
if (bcch_msg.pack(bref) != asn1::SRSASN_SUCCESS) {
logger.error("Couldn't pack SIB1 msg");
return SRSRAN_ERROR;
}
cell.packed_sib1->N_bytes = bref.distance_bytes();
}
logger.info(cell.packed_sib1->data(),
cell.packed_sib1->size(),
"BCCH-DL-SCH-Message (with SIB1) (%d B)",
cell.packed_sib1->size());
cell.sib1.to_json(js);
logger.info("SIB1 content: %s", js.to_string().c_str());
cells.push_back(std::move(obj));
return SRSRAN_SUCCESS;
}
} // namespace srsenb