From 2a933ed8ad526f9e041a4150bb60ef60c73c60c4 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 10 Dec 2021 20:42:04 +0000 Subject: [PATCH] nr,gnb,sched: refactor filling of dci harq fields --- .../hdr/stack/mac/sched_nr_grant_allocator.h | 1 - srsgnb/hdr/stack/mac/sched_nr_harq.h | 24 +++- srsgnb/hdr/stack/mac/sched_nr_helpers.h | 8 -- .../src/stack/mac/sched_nr_grant_allocator.cc | 130 ++++++++---------- srsgnb/src/stack/mac/sched_nr_harq.cc | 74 +++++++++- srsgnb/src/stack/mac/sched_nr_helpers.cc | 55 -------- srsgnb/src/stack/mac/sched_nr_pdcch.cc | 12 ++ 7 files changed, 158 insertions(+), 146 deletions(-) diff --git a/srsgnb/hdr/stack/mac/sched_nr_grant_allocator.h b/srsgnb/hdr/stack/mac/sched_nr_grant_allocator.h index 0d2dca71d..44850847a 100644 --- a/srsgnb/hdr/stack/mac/sched_nr_grant_allocator.h +++ b/srsgnb/hdr/stack/mac/sched_nr_grant_allocator.h @@ -116,7 +116,6 @@ public: private: alloc_result verify_uci_space(const bwp_slot_grid& uci_grid) const; - alloc_result verify_ue_cfg(const ue_carrier_params_t& ue_cfg, harq_proc* harq) const; bwp_res_grid& bwp_grid; diff --git a/srsgnb/hdr/stack/mac/sched_nr_harq.h b/srsgnb/hdr/stack/mac/sched_nr_harq.h index 7d88a4b71..91b1e2de2 100644 --- a/srsgnb/hdr/stack/mac/sched_nr_harq.h +++ b/srsgnb/hdr/stack/mac/sched_nr_harq.h @@ -48,8 +48,6 @@ public: bool clear_if_maxretx(slot_point slot_rx); void reset(); - bool new_tx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant, uint32_t mcs, uint32_t max_retx); - bool new_retx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant); bool new_retx(slot_point slot_tx, slot_point slot_ack); // NOTE: Has to be used before first tx is dispatched @@ -58,7 +56,10 @@ public: const uint32_t pid; -private: +protected: + bool new_tx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant, uint32_t mcs, uint32_t max_retx); + bool new_retx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant); + struct tb_t { bool active = false; bool ack_state = false; @@ -83,9 +84,18 @@ public: tx_harq_softbuffer& get_softbuffer() { return *softbuffer; } srsran::unique_byte_buffer_t* get_tx_pdu() { return &pdu; } - bool new_tx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant, uint32_t mcs, uint32_t max_retx); + bool new_tx(slot_point slot_tx, + slot_point slot_ack, + const prb_grant& grant, + uint32_t mcs, + uint32_t max_retx, + srsran_dci_dl_nr_t& dci); + + bool new_retx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant, srsran_dci_dl_nr_t& dci); private: + void fill_dci(srsran_dci_dl_nr_t& dci); + srsran::unique_pool_ptr softbuffer; srsran::unique_byte_buffer_t pdu; }; @@ -97,6 +107,10 @@ public: harq_proc(id_), softbuffer(harq_softbuffer_pool::get_instance().get_rx(nprb)) {} + bool new_tx(slot_point slot_tx, const prb_grant& grant, uint32_t mcs, uint32_t max_retx, srsran_dci_ul_nr_t& dci); + + bool new_retx(slot_point slot_tx, const prb_grant& grant, srsran_dci_ul_nr_t& dci); + rx_harq_softbuffer& get_softbuffer() { return *softbuffer; } bool set_tbs(uint32_t tbs) @@ -106,6 +120,8 @@ public: } private: + void fill_dci(srsran_dci_ul_nr_t& dci); + srsran::unique_pool_ptr softbuffer; }; diff --git a/srsgnb/hdr/stack/mac/sched_nr_helpers.h b/srsgnb/hdr/stack/mac/sched_nr_helpers.h index fdfddeeae..e6e231ab3 100644 --- a/srsgnb/hdr/stack/mac/sched_nr_helpers.h +++ b/srsgnb/hdr/stack/mac/sched_nr_helpers.h @@ -48,14 +48,6 @@ inline bool is_rnti_type_valid_in_search_space(srsran_rnti_type_t rnti_type, srs return false; } -bool fill_dci_msg3(const slot_ue& ue, const bwp_params_t& bwp_cfg, srsran_dci_ul_nr_t& dci); - -/// Generate PDCCH DL DCI fields -void fill_dl_dci_ue_fields(const slot_ue& ue, srsran_dci_dl_nr_t& dci); - -/// Generate PDCCH UL DCI fields -void fill_ul_dci_ue_fields(const slot_ue& ue, srsran_dci_ul_nr_t& dci); - /// Log UE state for slot being scheduled void log_sched_slot_ues(srslog::basic_logger& logger, slot_point pdcch_slot, diff --git a/srsgnb/src/stack/mac/sched_nr_grant_allocator.cc b/srsgnb/src/stack/mac/sched_nr_grant_allocator.cc index de005ea7a..60a1ab451 100644 --- a/srsgnb/src/stack/mac/sched_nr_grant_allocator.cc +++ b/srsgnb/src/stack/mac/sched_nr_grant_allocator.cc @@ -136,7 +136,7 @@ alloc_result bwp_slot_allocator::alloc_si(uint32_t aggr_idx, } pdcch_dl_t& pdcch = *pdcch_result.value(); - // Allocate PDSCH + // Allocate PDSCH (no need to verify again if there is space in PDSCH) pdsch_t& pdsch = bwp_pdcch_slot.pdschs.alloc_si_pdsch_unchecked(ss_id, prbs, pdcch.dci); // Generate DCI for SIB @@ -176,7 +176,7 @@ alloc_result bwp_slot_allocator::alloc_rar_and_msg3(uint16_t slot_point msg3_slot = pdcch_slot + cfg.pusch_ra_list[m].msg3_delay; bwp_slot_grid& bwp_msg3_slot = bwp_grid[msg3_slot]; - // Verify there is space in PDSCH + // Verify there is space in PDSCH for RAR alloc_result ret = bwp_pdcch_slot.pdschs.is_rar_grant_valid(interv); if (ret != alloc_result::success) { return ret; @@ -210,22 +210,20 @@ alloc_result bwp_slot_allocator::alloc_rar_and_msg3(uint16_t return alloc_result::sch_collision; } - // Allocate PDCCH position + // Allocate PDCCH position for RAR auto pdcch_result = bwp_pdcch_slot.pdcchs.alloc_rar_pdcch(ra_rnti, aggr_idx); if (pdcch_result.is_error()) { // Could not find space in PDCCH return pdcch_result.error(); } pdcch_dl_t& pdcch = *pdcch_result.value(); + pdcch.dci_cfg = slot_ues[pending_rachs[0].temp_crnti]->get_dci_cfg(); + pdcch.dci.mcs = 5; - // Allocate PDSCH + // Allocate RAR PDSCH pdsch_t& pdsch = bwp_pdcch_slot.pdschs.alloc_rar_pdsch_unchecked(interv, pdcch.dci); - // Generate DCI for RAR with given RA-RNTI - pdcch.dci_cfg = slot_ues[pending_rachs[0].temp_crnti]->get_dci_cfg(); - pdcch.dci.mcs = 5; - - // Generate RAR PDSCH + // Fill RAR PDSCH content // TODO: Properly fill Msg3 grants srsran_slot_cfg_t slot_cfg; slot_cfg.idx = pdcch_slot.to_uint(); @@ -247,16 +245,27 @@ alloc_result bwp_slot_allocator::alloc_rar_and_msg3(uint16_t rar_out.grants.emplace_back(); auto& rar_grant = rar_out.grants.back(); rar_grant.data = grant; + fill_dci_from_cfg(cfg, rar_grant.msg3_dci); + // Fill Msg3 DCI context + rar_grant.msg3_dci.ctx.coreset_id = pdcch.dci.ctx.coreset_id; + rar_grant.msg3_dci.ctx.rnti_type = srsran_rnti_type_tc; + rar_grant.msg3_dci.ctx.rnti = ue->rnti; + rar_grant.msg3_dci.ctx.ss_type = srsran_search_space_type_rar; + rar_grant.msg3_dci.ctx.format = srsran_dci_format_nr_rar; + + // Allocate Msg3 PUSCH allocation prb_interval msg3_interv{last_msg3, last_msg3 + msg3_nof_prbs}; last_msg3 += msg3_nof_prbs; - ue.h_ul = ue.find_empty_ul_harq(); - bool success = ue.h_ul->new_tx(msg3_slot, msg3_slot, msg3_interv, mcs, max_harq_msg3_retx); - srsran_assert(success, "Failed to allocate Msg3"); - fill_dci_msg3(ue, *bwp_grid.cfg, rar_grant.msg3_dci); - - // Generate PUSCH pusch_t& pusch = bwp_msg3_slot.puschs.alloc_pusch_unchecked(msg3_interv, rar_grant.msg3_dci); - success = ue->phy().get_pusch_cfg(slot_cfg, rar_grant.msg3_dci, pusch.sch); + + // Allocate UL HARQ + ue.h_ul = ue.find_empty_ul_harq(); + srsran_sanity_check(ue.h_ul != nullptr, "Failed to allocate Msg3"); + bool success = ue.h_ul->new_tx(msg3_slot, msg3_interv, mcs, max_harq_msg3_retx, rar_grant.msg3_dci); + srsran_sanity_check(success, "Failed to allocate Msg3"); + + // Generate PUSCH content + success = ue->phy().get_pusch_cfg(slot_cfg, rar_grant.msg3_dci, pusch.sch); srsran_assert(success, "Error converting DCI to PUSCH grant"); pusch.sch.grant.tb[0].softbuffer.rx = ue.h_ul->get_softbuffer().get(); ue.h_ul->set_tbs(pusch.sch.grant.tb[0].tbs); @@ -287,8 +296,8 @@ alloc_result bwp_slot_allocator::alloc_pdsch(slot_ue& ue, uint32_t ss_id, const if (result != alloc_result::success) { return result; } - result = verify_ue_cfg(ue.cfg(), ue.h_dl); - if (result != alloc_result::success) { + if (ue.h_dl == nullptr) { + logger.warning("SCHED: Trying to allocate rnti=0x%x with no available DL HARQs", ue->rnti); return result; } if (not bwp_pdsch_slot.dl.phy.ssb.empty()) { @@ -297,7 +306,7 @@ alloc_result bwp_slot_allocator::alloc_pdsch(slot_ue& ue, uint32_t ss_id, const return alloc_result::no_sch_space; } - // Find space in PUCCH + // Check space in PUCCH/PUSCH for UCI // TODO // Find space and allocate PDCCH @@ -306,7 +315,13 @@ alloc_result bwp_slot_allocator::alloc_pdsch(slot_ue& ue, uint32_t ss_id, const // Could not find space in PDCCH return pdcch_result.error(); } - pdcch_dl_t& pdcch = *pdcch_result.value(); + pdcch_dl_t& pdcch = *pdcch_result.value(); + pdcch.dci_cfg = ue->get_dci_cfg(); + pdcch.dci.pucch_resource = 0; + pdcch.dci.dai = std::count_if(bwp_uci_slot.pending_acks.begin(), + bwp_uci_slot.pending_acks.end(), + [&ue](const harq_ack_t& p) { return p.res.rnti == ue->rnti; }); + pdcch.dci.dai %= 4; // Allocate PDSCH pdsch_t& pdsch = bwp_pdcch_slot.pdschs.alloc_ue_pdsch_unchecked(ss_id, dci_fmt, dl_grant, ue.cfg(), pdcch.dci); @@ -314,42 +329,22 @@ alloc_result bwp_slot_allocator::alloc_pdsch(slot_ue& ue, uint32_t ss_id, const // Allocate HARQ int mcs = ue->fixed_pdsch_mcs(); if (ue.h_dl->empty()) { - bool success = ue.h_dl->new_tx(ue.pdsch_slot, ue.uci_slot, dl_grant, mcs, 4); + bool success = ue.h_dl->new_tx(ue.pdsch_slot, ue.uci_slot, dl_grant, mcs, 4, pdcch.dci); srsran_assert(success, "Failed to allocate DL HARQ"); } else { - bool success = ue.h_dl->new_retx(ue.pdsch_slot, ue.uci_slot, dl_grant); + bool success = ue.h_dl->new_retx(ue.pdsch_slot, ue.uci_slot, dl_grant, pdcch.dci); mcs = ue.h_dl->mcs(); srsran_assert(success, "Failed to allocate DL HARQ retx"); } - const static float max_R = 0.93; + srsran_slot_cfg_t slot_cfg; + slot_cfg.idx = ue.pdsch_slot.to_uint(); + const static float max_R = 0.95; while (true) { - // Generate PDCCH - fill_dl_dci_ue_fields(ue, pdcch.dci); - pdcch.dci.pucch_resource = 0; - pdcch.dci.dai = std::count_if(bwp_uci_slot.pending_acks.begin(), - bwp_uci_slot.pending_acks.end(), - [&ue](const harq_ack_t& p) { return p.res.rnti == ue->rnti; }); - pdcch.dci.dai %= 4; - pdcch.dci_cfg = ue->get_dci_cfg(); - - // Generate PUCCH - bwp_uci_slot.pending_acks.emplace_back(); - bwp_uci_slot.pending_acks.back().phy_cfg = &ue->phy(); - srsran_assert(ue->phy().get_pdsch_ack_resource(pdcch.dci, bwp_uci_slot.pending_acks.back().res), - "Error getting ack resource"); - // Generate PDSCH - srsran_slot_cfg_t slot_cfg; - slot_cfg.idx = ue.pdsch_slot.to_uint(); bool success = ue->phy().get_pdsch_cfg(slot_cfg, pdcch.dci, pdsch.sch); srsran_assert(success, "Error converting DCI to grant"); - - pdsch.sch.grant.tb[0].softbuffer.tx = ue.h_dl->get_softbuffer().get(); - pdsch.data[0] = ue.h_dl->get_tx_pdu()->get(); - if (ue.h_dl->nof_retx() == 0) { - ue.h_dl->set_tbs(pdsch.sch.grant.tb[0].tbs); // update HARQ with correct TBS - } else { + if (ue.h_dl->nof_retx() != 0) { srsran_assert(pdsch.sch.grant.tb[0].tbs == (int)ue.h_dl->tbs(), "The TBS did not remain constant in retx"); } if (ue.h_dl->nof_retx() > 0 or bwp_pdsch_slot.dl.phy.pdsch.back().sch.grant.tb[0].R_prime < max_R or mcs <= 0) { @@ -358,16 +353,24 @@ alloc_result bwp_slot_allocator::alloc_pdsch(slot_ue& ue, uint32_t ss_id, const // Decrease MCS if first tx and rate is too high mcs--; ue.h_dl->set_mcs(mcs); - bwp_uci_slot.pending_acks.pop_back(); } if (mcs == 0) { - logger.warning("Couldn't find mcs that leads to R<0.9"); + logger.warning("Couldn't find mcs that leads to R<0.95"); } + ue.h_dl->set_tbs(pdsch.sch.grant.tb[0].tbs); // set HARQ TBS + pdsch.sch.grant.tb[0].softbuffer.tx = ue.h_dl->get_softbuffer().get(); + pdsch.data[0] = ue.h_dl->get_tx_pdu()->get(); // Select scheduled LCIDs and update UE buffer state bwp_pdsch_slot.dl.data.emplace_back(); ue.build_pdu(ue.h_dl->tbs(), bwp_pdsch_slot.dl.data.back()); + // Generate PUCCH + bwp_uci_slot.pending_acks.emplace_back(); + bwp_uci_slot.pending_acks.back().phy_cfg = &ue->phy(); + srsran_assert(ue->phy().get_pdsch_ack_resource(pdcch.dci, bwp_uci_slot.pending_acks.back().res), + "Error getting ack resource"); + return alloc_result::success; } @@ -380,9 +383,9 @@ alloc_result bwp_slot_allocator::alloc_pusch(slot_ue& ue, const prb_grant& ul_gr auto& bwp_pdcch_slot = bwp_grid[ue.pdcch_slot]; auto& bwp_pusch_slot = bwp_grid[ue.pusch_slot]; - alloc_result ret = verify_ue_cfg(ue.cfg(), ue.h_ul); - if (ret != alloc_result::success) { - return ret; + if (ue.h_ul == nullptr) { + logger.warning("SCHED: Trying to allocate rnti=0x%x with no available UL HARQs", ue->rnti); + return alloc_result::no_rnti_opportunity; } // Choose SearchSpace + DCI format @@ -395,7 +398,7 @@ alloc_result bwp_slot_allocator::alloc_pusch(slot_ue& ue, const prb_grant& ul_gr const srsran_search_space_t& ss = *ss_candidates[0]; // Verify if PUSCH allocation is valid - ret = bwp_pusch_slot.puschs.is_grant_valid(ss.type, ul_grant); + alloc_result ret = bwp_pusch_slot.puschs.is_grant_valid(ss.type, ul_grant); if (ret != alloc_result::success) { return ret; } @@ -408,23 +411,20 @@ alloc_result bwp_slot_allocator::alloc_pusch(slot_ue& ue, const prb_grant& ul_gr // Allocation Successful pdcch_ul_t& pdcch = *pdcch_result.value(); + pdcch.dci_cfg = ue->get_dci_cfg(); // Allocate PUSCH pusch_t& pusch = bwp_pusch_slot.puschs.alloc_pusch_unchecked(ul_grant, pdcch.dci); if (ue.h_ul->empty()) { int mcs = ue->fixed_pusch_mcs(); - bool success = ue.h_ul->new_tx(ue.pusch_slot, ue.pusch_slot, ul_grant, mcs, ue->ue_cfg().maxharq_tx); + bool success = ue.h_ul->new_tx(ue.pusch_slot, ul_grant, mcs, ue->ue_cfg().maxharq_tx, pdcch.dci); srsran_assert(success, "Failed to allocate UL HARQ"); } else { - bool success = ue.h_ul->new_retx(ue.pusch_slot, ue.pusch_slot, ul_grant); + bool success = ue.h_ul->new_retx(ue.pusch_slot, ul_grant, pdcch.dci); srsran_assert(success, "Failed to allocate UL HARQ retx"); } - // Generate PDCCH content - fill_ul_dci_ue_fields(ue, pdcch.dci); - pdcch.dci_cfg = ue->get_dci_cfg(); - // Generate PUSCH content srsran_slot_cfg_t slot_cfg; slot_cfg.idx = ue.pusch_slot.to_uint(); @@ -450,20 +450,6 @@ alloc_result bwp_slot_allocator::verify_uci_space(const bwp_slot_grid& uci_grid) return alloc_result::success; } -alloc_result bwp_slot_allocator::verify_ue_cfg(const ue_carrier_params_t& ue_cfg, harq_proc* harq) const -{ - if (ue_cfg.active_bwp().bwp_id != cfg.bwp_id) { - logger.warning( - "SCHED: Trying to allocate rnti=0x%x in inactive BWP id=%d", ue_cfg.rnti, ue_cfg.active_bwp().bwp_id); - return alloc_result::no_rnti_opportunity; - } - if (harq == nullptr) { - logger.warning("SCHED: Trying to allocate rnti=0x%x with no available HARQs", ue_cfg.rnti); - return alloc_result::no_rnti_opportunity; - } - return alloc_result::success; -} - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// prb_grant find_optimal_dl_grant(bwp_slot_allocator& slot_alloc, const slot_ue& ue, uint32_t ss_id) diff --git a/srsgnb/src/stack/mac/sched_nr_harq.cc b/srsgnb/src/stack/mac/sched_nr_harq.cc index a70c8f877..a9f8a2c81 100644 --- a/srsgnb/src/stack/mac/sched_nr_harq.cc +++ b/srsgnb/src/stack/mac/sched_nr_harq.cc @@ -115,14 +115,76 @@ dl_harq_proc::dl_harq_proc(uint32_t id_, uint32_t nprb) : harq_proc(id_), softbuffer(harq_softbuffer_pool::get_instance().get_tx(nprb)), pdu(srsran::make_byte_buffer()) {} -bool dl_harq_proc::new_tx(slot_point slot_tx, - slot_point slot_ack, - const prb_grant& grant, - uint32_t mcs, - uint32_t max_retx) +void dl_harq_proc::fill_dci(srsran_dci_dl_nr_t& dci) { - if (harq_proc::new_tx(slot_tx, slot_ack, grant, mcs, max_retx)) { + const static uint32_t rv_idx[4] = {0, 2, 3, 1}; + + dci.pid = pid; + dci.ndi = ndi(); + dci.mcs = mcs(); + dci.rv = rv_idx[nof_retx() % 4]; + if (dci.ctx.format == srsran_dci_format_nr_1_0) { + dci.harq_feedback = (slot_ack - slot_tx) - 1; + } else { + dci.harq_feedback = slot_tx.to_uint(); + } +} + +bool dl_harq_proc::new_tx(slot_point slot_tx, + slot_point slot_ack, + const prb_grant& grant, + uint32_t mcs_, + uint32_t max_retx, + srsran_dci_dl_nr_t& dci) +{ + const static uint32_t rv_idx[4] = {0, 2, 3, 1}; + + if (harq_proc::new_tx(slot_tx, slot_ack, grant, mcs_, max_retx)) { pdu->clear(); + fill_dci(dci); + return true; + } + return false; +} + +bool dl_harq_proc::new_retx(slot_point slot_tx, slot_point slot_ack, const prb_grant& grant, srsran_dci_dl_nr_t& dci) +{ + if (harq_proc::new_retx(slot_tx, slot_ack, grant)) { + fill_dci(dci); + return true; + } + return false; +} + +void ul_harq_proc::fill_dci(srsran_dci_ul_nr_t& dci) +{ + const static uint32_t rv_idx[4] = {0, 2, 3, 1}; + + dci.pid = pid; + dci.ndi = ndi(); + dci.mcs = mcs(); + dci.rv = rv_idx[nof_retx() % 4]; +} + +bool ul_harq_proc::new_tx(slot_point slot_tx, + const prb_grant& grant, + uint32_t mcs_, + uint32_t max_retx, + srsran_dci_ul_nr_t& dci) +{ + const static uint32_t rv_idx[4] = {0, 2, 3, 1}; + + if (harq_proc::new_tx(slot_tx, slot_tx, grant, mcs_, max_retx)) { + fill_dci(dci); + return true; + } + return false; +} + +bool ul_harq_proc::new_retx(slot_point slot_tx, const prb_grant& grant, srsran_dci_ul_nr_t& dci) +{ + if (harq_proc::new_retx(slot_tx, slot_tx, grant)) { + fill_dci(dci); return true; } return false; diff --git a/srsgnb/src/stack/mac/sched_nr_helpers.cc b/srsgnb/src/stack/mac/sched_nr_helpers.cc index 57f1a7cab..cf17981c3 100644 --- a/srsgnb/src/stack/mac/sched_nr_helpers.cc +++ b/srsgnb/src/stack/mac/sched_nr_helpers.cc @@ -19,61 +19,6 @@ namespace srsenb { namespace sched_nr_impl { -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -template -void fill_dci_harq(const slot_ue& ue, DciDlOrUl& dci) -{ - const static uint32_t rv_idx[4] = {0, 2, 3, 1}; - - harq_proc* h = std::is_same::value ? static_cast(ue.h_dl) - : static_cast(ue.h_ul); - - dci.pid = h->pid; - dci.ndi = h->ndi(); - dci.mcs = h->mcs(); - dci.rv = rv_idx[h->nof_retx() % 4]; -} - -bool fill_dci_msg3(const slot_ue& ue, const bwp_params_t& bwp_cfg, srsran_dci_ul_nr_t& msg3_dci) -{ - // Fill DCI context - msg3_dci.ctx.coreset_id = ue->phy().pdcch.ra_search_space.coreset_id; - msg3_dci.ctx.rnti_type = srsran_rnti_type_tc; - msg3_dci.ctx.rnti = ue->rnti; - msg3_dci.ctx.ss_type = srsran_search_space_type_rar; - if (ue.h_ul->nof_retx() == 0) { - msg3_dci.ctx.format = srsran_dci_format_nr_rar; - } else { - msg3_dci.ctx.format = srsran_dci_format_nr_0_0; - } - - // Fill DCI content - fill_dci_from_cfg(bwp_cfg, msg3_dci); - msg3_dci.time_domain_assigment = 0; - uint32_t nof_prb = bwp_cfg.nof_prb(); - msg3_dci.freq_domain_assigment = - srsran_ra_nr_type1_riv(nof_prb, ue.h_ul->prbs().prbs().start(), ue.h_ul->prbs().prbs().length()); - fill_dci_harq(ue, msg3_dci); - - return true; -} - -void fill_dl_dci_ue_fields(const slot_ue& ue, srsran_dci_dl_nr_t& dci) -{ - fill_dci_harq(ue, dci); - if (dci.ctx.format == srsran_dci_format_nr_1_0) { - dci.harq_feedback = (ue.uci_slot - ue.pdsch_slot) - 1; - } else { - dci.harq_feedback = ue.pdsch_slot.slot_idx(); - } -} - -void fill_ul_dci_ue_fields(const slot_ue& ue, srsran_dci_ul_nr_t& dci) -{ - fill_dci_harq(ue, dci); -} - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void log_sched_slot_ues(srslog::basic_logger& logger, slot_point pdcch_slot, uint32_t cc, const slot_ue_map_t& slot_ues) diff --git a/srsgnb/src/stack/mac/sched_nr_pdcch.cc b/srsgnb/src/stack/mac/sched_nr_pdcch.cc index cb34f8dc5..59642c95c 100644 --- a/srsgnb/src/stack/mac/sched_nr_pdcch.cc +++ b/srsgnb/src/stack/mac/sched_nr_pdcch.cc @@ -475,6 +475,18 @@ alloc_result bwp_pdcch_allocator::check_args_valid(srsran_rnti_type_t rn return alloc_result::no_cch_space; } + if (user != nullptr) { + if (user->active_bwp().bwp_id != bwp_cfg.bwp_id) { + log_pdcch_alloc_failure(logger.warning, + rnti_type, + ss_id, + rnti, + "Trying to allocate BWP#{} which is inactive for the UE.", + user->active_bwp().bwp_id); + return alloc_result::no_rnti_opportunity; + } + } + srsran_sanity_check(pdcch_dl_list.size() + pdcch_ul_list.size() == nof_allocations(), "Invalid PDCCH state"); return alloc_result::success; }