nr,gnb,rrc: propagate RRC SIB configurations to mac and scheduler

master
Francisco 3 years ago committed by Francisco Paisana
parent 5766ddfa38
commit ae4071a3df

@ -67,6 +67,7 @@ public:
struct cell_cfg_sib_t { struct cell_cfg_sib_t {
uint32_t len; uint32_t len;
uint32_t period_rf; uint32_t period_rf;
uint32_t si_window_slots;
}; };
struct cell_cfg_t { struct cell_cfg_t {

@ -66,9 +66,9 @@ private:
struct si_msg_ctxt_t { struct si_msg_ctxt_t {
// args // args
uint32_t n = 0; /// 0 for SIB1, n/index in schedulingInfoList in si-SchedulingInfo in SIB1 uint32_t n = 0; /// 0 for SIB1, n/index in schedulingInfoList in si-SchedulingInfo in SIB1
uint32_t len = 0; /// length in bytes of SIB1 / SI message uint32_t len_bytes = 0; /// length in bytes of SIB1 / SI message
uint32_t win_len = 0; /// window length in slots uint32_t win_len_slots = 0; /// window length in slots
uint32_t period = 0; /// periodicity of SIB1/SI window uint32_t period_frames = 0; /// periodicity of SIB1/SI window in frames
// state // state
uint32_t n_tx = 0; /// nof transmissions of the same SIB1 / SI message uint32_t n_tx = 0; /// nof transmissions of the same SIB1 / SI message

@ -255,9 +255,7 @@ int mac_nr::cell_cfg(const std::vector<srsenb::sched_nr_interface::cell_cfg_t>&
detected_rachs.resize(nr_cells.size()); detected_rachs.resize(nr_cells.size());
// read SIBs from RRC (SIB1 for now only) // read SIBs from RRC (SIB1 for now only)
for (int i = 0; i < 1 /* srsenb::sched_interface::MAX_SIBS */; i++) { for (uint32_t i = 0; i < nr_cells[0].sibs.size(); i++) {
// TODO: add flag for SIBs into cell config
if (true) {
sib_info_t sib = {}; sib_info_t sib = {};
sib.index = i; sib.index = i;
sib.periodicity = 160; // TODO: read period_rf from config sib.periodicity = 160; // TODO: read period_rf from config
@ -273,7 +271,6 @@ int mac_nr::cell_cfg(const std::vector<srsenb::sched_nr_interface::cell_cfg_t>&
logger.info("Including SIB %d into SI scheduling", sib.index + 1); logger.info("Including SIB %d into SI scheduling", sib.index + 1);
bcch_dlsch_payload.push_back(std::move(sib)); bcch_dlsch_payload.push_back(std::move(sib));
} }
}
rx.reset(new mac_nr_rx{rlc, rrc, stack_task_queue, sched.get(), logger}); rx.reset(new mac_nr_rx{rlc, rrc, stack_task_queue, sched.get(), logger});

@ -129,13 +129,15 @@ bool fill_dci_sib(prb_interval interv,
si_sched::si_sched(const bwp_params_t& bwp_cfg_) : si_sched::si_sched(const bwp_params_t& bwp_cfg_) :
bwp_cfg(&bwp_cfg_), logger(srslog::fetch_basic_logger(bwp_cfg_.sched_cfg.logger_name)) bwp_cfg(&bwp_cfg_), logger(srslog::fetch_basic_logger(bwp_cfg_.sched_cfg.logger_name))
{ {
// TODO: Get SIB1 other SI msgs config from RRC for (uint32_t i = 0; i < bwp_cfg->cell_cfg.sibs.size(); ++i) {
pending_sis.emplace_back(); pending_sis.emplace_back();
pending_sis[0].n = 0; si_msg_ctxt_t& si = pending_sis.back();
pending_sis[0].len = 77; si.n = i;
pending_sis[0].period = 160; si.len_bytes = bwp_cfg->cell_cfg.sibs[i].len;
pending_sis[0].win_len = 160; si.period_frames = bwp_cfg->cell_cfg.sibs[i].period_rf;
pending_sis[0].si_softbuffer = harq_softbuffer_pool::get_instance().get_tx(bwp_cfg->nof_prb()); si.win_len_slots = bwp_cfg->cell_cfg.sibs[i].si_window_slots;
si.si_softbuffer = harq_softbuffer_pool::get_instance().get_tx(bwp_cfg->nof_prb());
}
} }
void si_sched::run_slot(bwp_slot_allocator& bwp_alloc) void si_sched::run_slot(bwp_slot_allocator& bwp_alloc)
@ -152,7 +154,7 @@ void si_sched::run_slot(bwp_slot_allocator& bwp_alloc)
// Update SI windows // Update SI windows
uint32_t N = bwp_cfg->slots.size(); uint32_t N = bwp_cfg->slots.size();
for (si_msg_ctxt_t& si : pending_sis) { for (si_msg_ctxt_t& si : pending_sis) {
uint32_t x = (si.n - 1) * si.win_len; uint32_t x = (si.n - 1) * si.win_len_slots;
if (not si.win_start.valid()) { if (not si.win_start.valid()) {
bool start_window; bool start_window;
@ -161,20 +163,21 @@ void si_sched::run_slot(bwp_slot_allocator& bwp_alloc)
start_window = sl_pdcch.slot_idx() == 0 and sl_pdcch.sfn() % 2 == 0; start_window = sl_pdcch.slot_idx() == 0 and sl_pdcch.sfn() % 2 == 0;
} else { } else {
// 5.2.2.3.2 - Acquisition of SI message // 5.2.2.3.2 - Acquisition of SI message
start_window = (sl_pdcch.sfn() % si.period == x / N) and sl_pdcch.slot_idx() == x % bwp_cfg->slots.size(); start_window =
(sl_pdcch.sfn() % si.period_frames == x / N) and sl_pdcch.slot_idx() == x % bwp_cfg->slots.size();
} }
if (start_window) { if (start_window) {
// If start of SI message window // If start of SI message window
si.win_start = sl_pdcch; si.win_start = sl_pdcch;
si.n_tx = 0; si.n_tx = 0;
} }
} else if (si.win_start + si.win_len >= sl_pdcch) { } else if (si.win_start + si.win_len_slots >= sl_pdcch) {
// If end of SI message window // If end of SI message window
if (si.n == 0) { if (si.n == 0) {
logger.error("SCHED: Could not allocate SIB1, len=%d. Cause: %s", si.len, to_string(si.result)); logger.error("SCHED: Could not allocate SIB1, len=%d. Cause: %s", si.len_bytes, to_string(si.result));
} else { } else {
logger.warning( logger.warning(
"SCHED: Could not allocate SI message idx=%d, len=%d. Cause: %s", si.n, si.len, to_string(si.result)); "SCHED: Could not allocate SI message idx=%d, len=%d. Cause: %s", si.n, si.len_bytes, to_string(si.result));
} }
si.win_start.clear(); si.win_start.clear();
} }
@ -205,9 +208,9 @@ void si_sched::run_slot(bwp_slot_allocator& bwp_alloc)
si.win_start.clear(); si.win_start.clear();
si.n_tx++; si.n_tx++;
if (si.n == 0) { if (si.n == 0) {
logger.debug("SCHED: Allocated SIB1, len=%d.", si.n, si.len); logger.debug("SCHED: Allocated SIB1, len=%d.", si.n, si.len_bytes);
} else { } else {
logger.debug("SCHED: Allocated SI message idx=%d, len=%d.", si.n, si.len); logger.debug("SCHED: Allocated SI message idx=%d, len=%d.", si.n, si.len_bytes);
} }
} }
} }

@ -301,8 +301,10 @@ void rrc_nr::config_mac()
cell.sibs[i].len = cell_ctxt->sib_buffer[i]->N_bytes; cell.sibs[i].len = cell_ctxt->sib_buffer[i]->N_bytes;
if (i == 0) { if (i == 0) {
cell.sibs[i].period_rf = 16; // SIB1 is always 16 rf cell.sibs[i].period_rf = 16; // SIB1 is always 16 rf
cell.sibs[i].si_window_slots = 160;
} else { } else {
cell.sibs[i].period_rf = cell_ctxt->sib1.si_sched_info.sched_info_list[i - 1].si_periodicity.to_number(); cell.sibs[i].period_rf = cell_ctxt->sib1.si_sched_info.sched_info_list[i - 1].si_periodicity.to_number();
cell.sibs[i].si_window_slots = cell_ctxt->sib1.si_sched_info.si_win_len.to_number();
} }
} }
@ -406,7 +408,7 @@ int rrc_nr::read_pdu_bcch_bch(const uint32_t tti, srsran::byte_buffer_t& buffer)
int rrc_nr::read_pdu_bcch_dlsch(uint32_t sib_index, srsran::byte_buffer_t& buffer) int rrc_nr::read_pdu_bcch_dlsch(uint32_t sib_index, srsran::byte_buffer_t& buffer)
{ {
if (sib_index >= cell_ctxt->sib_buffer.size()) { if (sib_index >= cell_ctxt->sib_buffer.size()) {
logger.error("SIB %d is not a configured SIB.", sib_index); logger.error("SI%s%d is not a configured SIB.", sib_index == 0 ? "B" : "", sib_index + 1);
return SRSRAN_ERROR; return SRSRAN_ERROR;
} }

Loading…
Cancel
Save