allow PUSCH grants for CQI in PCell

master
Francisco Paisana 4 years ago
parent 2ade364434
commit a351b2534e

@ -29,6 +29,7 @@
#include <vector>
#include "scheduler_harq.h"
#include <bitset>
#include <deque>
namespace srsenb {
@ -240,7 +241,11 @@ public:
srslte_dci_format_t get_dci_format();
sched_dci_cce_t* get_locations(uint32_t enb_cc_idx, uint32_t current_cfi, uint32_t sf_idx);
cc_sched_ue* find_ue_carrier(uint32_t enb_cc_idx);
cc_sched_ue* find_ue_carrier(uint32_t enb_cc_idx);
size_t nof_carriers() const { return carriers.size(); }
std::bitset<SRSLTE_MAX_CARRIERS> scell_activation_mask() const;
int find_enb_cc_idx(uint32_t enb_cc_idx) const;
bool needs_cqi(uint32_t tti, uint32_t cc_idx, bool will_send = false);
uint32_t get_max_retx();

@ -770,7 +770,7 @@ alloc_outcome_t sf_sched::alloc_dl_user(sched_ue* user, const rbgmask_t& user_ma
}
// Check if allocation would cause segmentation
uint32_t ue_cc_idx = user->get_active_cell_index(cc_cfg->enb_cc_idx).second;
uint32_t ue_cc_idx = user->find_enb_cc_idx(cc_cfg->enb_cc_idx);
const dl_harq_proc& h = user->get_dl_harq(pid, ue_cc_idx);
if (h.is_empty()) {
// It is newTx
@ -782,16 +782,17 @@ alloc_outcome_t sf_sched::alloc_dl_user(sched_ue* user, const rbgmask_t& user_ma
}
// Check if there is space in the PUCCH for HARQ ACKs
const sched_interface::ue_cfg_t& ue_cfg = user->get_ue_cfg();
bool has_scells = ue_cfg.supported_cc_list.size() > 1;
if (has_scells and is_periodic_cqi_expected(ue_cfg, get_tti_tx_ul())) {
const sched_interface::ue_cfg_t& ue_cfg = user->get_ue_cfg();
std::bitset<SRSLTE_MAX_CARRIERS> scells = user->scell_activation_mask();
if (scells.any() and (ue_cc_idx == 0 or scells[ue_cc_idx]) and is_periodic_cqi_expected(ue_cfg, get_tti_tx_ul())) {
bool has_pusch_grant = is_ul_alloc(user->get_rnti()) or cc_results->is_ul_alloc(user->get_rnti());
if (not has_pusch_grant) {
// Try to allocate small PUSCH grant, if there are no allocated PUSCH grants for this TTI yet
prb_interval alloc = {};
uint32_t L = user->get_required_prb_ul(ue_cc_idx, srslte::ceil_div(SRSLTE_UCI_CQI_CODED_PUCCH_B + 2, 8));
tti_alloc.find_ul_alloc(L, &alloc);
if (ue_cc_idx != 0 and (alloc.length() == 0 or not alloc_ul_user(user, alloc))) {
bool ul_alloc_success = alloc.length() > 0 or alloc_ul_user(user, alloc);
if (ue_cc_idx != 0 and not ul_alloc_success) {
// For SCells, if we can't allocate small PUSCH grant, abort DL allocation
return alloc_outcome_t::PUCCH_COLLISION;
}

@ -1199,11 +1199,28 @@ sched_dci_cce_t* sched_ue::get_locations(uint32_t enb_cc_idx, uint32_t cfi, uint
}
cc_sched_ue* sched_ue::find_ue_carrier(uint32_t enb_cc_idx)
{
int ue_cc_idx = find_enb_cc_idx(enb_cc_idx);
return ue_cc_idx >= 0 ? &carriers[ue_cc_idx] : nullptr;
}
std::bitset<SRSLTE_MAX_CARRIERS> sched_ue::scell_activation_mask() const
{
std::bitset<SRSLTE_MAX_CARRIERS> ret{0};
for (size_t i = 1; i < carriers.size(); ++i) {
if (carriers[i].cc_state() == cc_st::active) {
ret[i] = true;
}
}
return ret;
}
int sched_ue::find_enb_cc_idx(uint32_t enb_cc_idx) const
{
auto it = std::find_if(carriers.begin(), carriers.end(), [enb_cc_idx](const cc_sched_ue& c) {
return c.get_cell_cfg()->enb_cc_idx == enb_cc_idx;
});
return it != carriers.end() ? &(*it) : nullptr;
return it != carriers.end() ? std::distance(carriers.begin(), it) : -1;
}
int cc_sched_ue::cqi_to_tbs(uint32_t nof_prb, uint32_t nof_re, bool use_tbs_index_alt, bool is_ul, uint32_t* mcs)

Loading…
Cancel
Save