use initial_dl_cqi for first DL tx.

This commit is contained in:
Francisco Paisana 2020-03-10 15:00:03 +00:00
parent ab69c6fe43
commit bcbb08ebae
4 changed files with 37 additions and 25 deletions

View File

@ -50,7 +50,7 @@ struct sched_ue_carrier {
uint32_t get_required_prb_ul(uint32_t req_bytes);
const sched_cell_params_t* get_cell_cfg() const { return cell_params; }
bool is_active() const { return active; }
void update_cell_activity();
void set_dl_cqi(uint32_t tti_tx_dl, uint32_t dl_cqi);
harq_entity harq_ent;
@ -62,6 +62,7 @@ struct sched_ue_carrier {
uint32_t dl_cqi_tti = 0;
uint32_t ul_cqi = 1;
uint32_t ul_cqi_tti = 0;
bool dl_cqi_rx = false;
int max_mcs_dl = 28, max_mcs_ul = 28;
uint32_t max_aggr_level = 3;
@ -131,7 +132,7 @@ public:
uint32_t get_required_prb_ul(uint32_t cc_idx, uint32_t req_bytes);
std::pair<uint32_t, uint32_t> get_requested_dl_rbgs(uint32_t ue_cc_idx, uint32_t nof_ctrl_symbols);
std::pair<uint32_t, uint32_t> get_required_dl_rbgs(uint32_t ue_cc_idx, uint32_t nof_ctrl_symbols);
std::pair<uint32_t, uint32_t> get_requested_dl_bytes(uint32_t ue_cc_idx);
uint32_t get_pending_dl_new_data();
uint32_t get_pending_ul_new_data(uint32_t tti);

View File

@ -133,7 +133,7 @@ dl_harq_proc* dl_metric_rr::allocate_user(sched_ue* user)
h = user->get_empty_dl_harq(tti_dl, cell_idx);
if (h != nullptr) {
// Allocate resources based on pending data
std::pair<uint32_t, uint32_t> req_rbgs = user->get_requested_dl_rbgs(cell_idx, tti_alloc->get_nof_ctrl_symbols());
std::pair<uint32_t, uint32_t> req_rbgs = user->get_required_dl_rbgs(cell_idx, tti_alloc->get_nof_ctrl_symbols());
if (req_rbgs.first > 0) {
rbgmask_t newtx_mask(tti_alloc->get_dl_mask().size());
if (find_allocation(req_rbgs.first, req_rbgs.second, &newtx_mask)) {

View File

@ -44,7 +44,8 @@ namespace srsenb {
namespace sched_utils {
constexpr uint32_t conres_ce_size = 6;
const uint32_t initial_dl_cqi = 5;
const uint32_t conres_ce_size = 6;
//! Obtains TB size *in bytes* for a given MCS and N_{PRB}
uint32_t get_tbs_bytes(uint32_t mcs, uint32_t nof_alloc_prb, bool is_ul)
@ -329,9 +330,7 @@ void sched_ue::set_dl_cqi(uint32_t tti, uint32_t enb_cc_idx, uint32_t cqi)
{
auto p = get_cell_index(enb_cc_idx);
if (p.second != std::numeric_limits<uint32_t>::max()) {
carriers[p.second].dl_cqi = cqi;
carriers[p.second].dl_cqi_tti = tti;
carriers[p.second].update_cell_activity();
carriers[p.second].set_dl_cqi(tti, cqi);
} else {
log_h->warning("Received DL CQI for invalid cell index %d\n", enb_cc_idx);
}
@ -534,14 +533,13 @@ std::pair<int, int> sched_ue::compute_mcs_and_tbs(uint32_t ue_cc_i
uint32_t nof_re = srslte_ra_dl_grant_nof_re(&carriers[ue_cc_idx].get_cell_cfg()->cfg.cell, &dl_sf, &grant);
// Compute MCS+TBS
mcs = carriers[ue_cc_idx].fixed_mcs_dl;
// Use a higher MCS for the Msg4 to fit in the 6 PRB case
if (mcs < 0) {
if (carriers[ue_cc_idx].fixed_mcs_dl < 0 or not carriers[ue_cc_idx].dl_cqi_rx) {
// Dynamic MCS
tbs_bytes = carriers[ue_cc_idx].alloc_tbs_dl(nof_alloc_prbs, nof_re, req_bytes.second, &mcs);
} else {
// Fixed MCS
tbs_bytes = sched_utils::get_tbs_bytes((uint32_t)mcs, nof_alloc_prbs, false);
tbs_bytes = sched_utils::get_tbs_bytes((uint32_t)carriers[ue_cc_idx].fixed_mcs_dl, nof_alloc_prbs, false);
}
// If the number of prbs is not sufficient to fit minimum required bytes, increase the mcs
@ -818,15 +816,24 @@ uint32_t sched_ue::get_pending_dl_new_data_total()
return req_bytes;
}
std::pair<uint32_t, uint32_t> sched_ue::get_requested_dl_rbgs(uint32_t ue_cc_idx, uint32_t nof_ctrl_symbols)
std::pair<uint32_t, uint32_t> sched_ue::get_required_dl_rbgs(uint32_t ue_cc_idx, uint32_t nof_ctrl_symbols)
{
std::pair<uint32_t, uint32_t> req_bytes = get_requested_dl_bytes(ue_cc_idx);
if (req_bytes.first == 0 and req_bytes.second == 0) {
return {0, 0};
}
uint32_t pending_prbs = carriers[ue_cc_idx].get_required_prb_dl(req_bytes.first, nof_ctrl_symbols);
uint32_t pending_prbs = carriers[ue_cc_idx].get_required_prb_dl(req_bytes.first, nof_ctrl_symbols);
if (pending_prbs > carriers[ue_cc_idx].get_cell_cfg()->nof_prb()) {
// Cannot fit allocation in given PRBs
log_h->error("SCHED: DL CQI=%d does now allow fitting %d non-segmentable DL tx bytes into the cell bandwidth. "
"Consider increasing initial CQI value.\n",
carriers[ue_cc_idx].dl_cqi,
req_bytes.first);
return {pending_prbs, pending_prbs};
}
uint32_t min_pending_rbg = (*cell_params_list)[cfg.supported_cc_list[ue_cc_idx].enb_cc_idx].prb_to_rbg(pending_prbs);
pending_prbs = carriers[ue_cc_idx].get_required_prb_dl(req_bytes.second, nof_ctrl_symbols);
pending_prbs = std::min(pending_prbs, carriers[ue_cc_idx].get_cell_cfg()->nof_prb());
uint32_t max_pending_rbg = (*cell_params_list)[cfg.supported_cc_list[ue_cc_idx].enb_cc_idx].prb_to_rbg(pending_prbs);
return {min_pending_rbg, max_pending_rbg};
}
@ -873,7 +880,7 @@ std::pair<uint32_t, uint32_t> sched_ue::get_requested_dl_bytes(uint32_t ue_cc_id
srb0_data = compute_sdu_total_bytes(0, lch[0].buf_retx);
srb0_data += compute_sdu_total_bytes(0, lch[0].buf_tx);
if (conres_ce_pending) {
sum_ce_data = sched_utils::conres_ce_size + 1;
sum_ce_data = sched_utils::conres_ce_size + ce_subheader_size;
}
}
// Add pending CEs
@ -1184,8 +1191,9 @@ sched_ue_carrier::sched_ue_carrier(const sched_interface::ue_cfg_t& cfg_,
harq_ent(SCHED_MAX_HARQ_PROC, SCHED_MAX_HARQ_PROC)
{
// only PCell starts active. Remaining ones wait for valid CQI
active = ue_cc_idx == 0;
dl_cqi = (ue_cc_idx == 0) ? 1 : 0;
active = ue_cc_idx == 0;
dl_cqi_rx = false;
dl_cqi = (ue_cc_idx == 0) ? sched_utils::initial_dl_cqi : 0;
// set max mcs
max_mcs_ul = cell_params->sched_cfg->pusch_max_mcs >= 0 ? cell_params->sched_cfg->pusch_max_mcs : 28;
@ -1314,7 +1322,7 @@ uint32_t sched_ue_carrier::get_required_prb_dl(uint32_t req_bytes, uint32_t nof_
uint32_t n;
for (n = 0; n < cell_params->nof_prb() and nbytes < req_bytes; ++n) {
nof_re = srslte_ra_dl_approx_nof_re(&cell_params->cfg.cell, n + 1, nof_ctrl_symbols);
if (fixed_mcs_dl < 0) {
if (fixed_mcs_dl < 0 or not dl_cqi_rx) {
tbs = alloc_tbs_dl(n + 1, nof_re, 0, &mcs);
} else {
tbs = srslte_ra_tbs_from_idx(srslte_ra_tbs_idx_from_mcs(fixed_mcs_dl, false), n + 1) / 8;
@ -1326,7 +1334,7 @@ uint32_t sched_ue_carrier::get_required_prb_dl(uint32_t req_bytes, uint32_t nof_
}
}
return n;
return (nbytes >= req_bytes) ? n : std::numeric_limits<uint32_t>::max();
}
uint32_t sched_ue_carrier::get_required_prb_ul(uint32_t req_bytes)
@ -1360,10 +1368,13 @@ uint32_t sched_ue_carrier::get_required_prb_ul(uint32_t req_bytes)
return n;
}
void sched_ue_carrier::update_cell_activity()
void sched_ue_carrier::set_dl_cqi(uint32_t tti_tx_dl, uint32_t dl_cqi_)
{
dl_cqi = dl_cqi_;
dl_cqi_tti = tti_tx_dl;
dl_cqi_rx = dl_cqi_rx or dl_cqi > 0;
if (ue_cc_idx > 0 and active != cfg->supported_cc_list[ue_cc_idx].active) {
if (dl_cqi > 0) {
if (dl_cqi_rx) {
active = cfg->supported_cc_list[ue_cc_idx].active;
log_h->info("SCell index=%d is now %s\n", ue_cc_idx, active ? "active" : "inactive");
}

View File

@ -142,21 +142,21 @@ int test_scell_activation(test_scell_activation_params params)
tester.test_next_ttis(generator.tti_events);
// Event (20 TTIs): Data back and forth
auto generate_data = [&](uint32_t nof_ttis, float prob_dl, float prob_ul) {
auto generate_data = [&](uint32_t nof_ttis, float prob_dl, float prob_ul, float rand_exp) {
for (uint32_t i = 0; i < nof_ttis; ++i) {
generator.step_tti();
bool ul_flag = randf() < prob_ul, dl_flag = randf() < prob_dl;
if (dl_flag) {
float exp = dl_data_exps[0] + randf() * (dl_data_exps[1] - dl_data_exps[0]);
float exp = dl_data_exps[0] + rand_exp * (dl_data_exps[1] - dl_data_exps[0]);
generator.add_dl_data(rnti1, pow(10, exp));
}
if (ul_flag) {
float exp = ul_sr_exps[0] + randf() * (ul_sr_exps[1] - ul_sr_exps[0]);
float exp = ul_sr_exps[0] + rand_exp * (ul_sr_exps[1] - ul_sr_exps[0]);
generator.add_ul_data(rnti1, pow(10, exp));
}
}
};
generate_data(20, P_dl, P_ul_sr);
generate_data(20, P_dl, P_ul_sr, randf());
tester.test_next_ttis(generator.tti_events);
// Event: Reconf Complete. Activate SCells. Check if CE correctly transmitted
@ -196,7 +196,7 @@ int test_scell_activation(test_scell_activation_params params)
// Event: Generate a bit more data, it should *not* go through SCells until we send a CQI
tester.dl_cqi_info(tester.tti_info.tti_params.tti_rx, rnti1, 1, cqi);
generate_data(5, P_dl, P_ul_sr);
generate_data(5, P_dl, P_ul_sr, randf());
tester.test_next_ttis(generator.tti_events);
TESTASSERT(tester.sched_stats->users[rnti1].tot_dl_sched_data[params.pcell_idx] > 0);
TESTASSERT(tester.sched_stats->users[rnti1].tot_ul_sched_data[params.pcell_idx] > 0);
@ -210,7 +210,7 @@ int test_scell_activation(test_scell_activation_params params)
for (uint32_t i = 1; i < cc_idxs.size(); ++i) {
tester.dl_cqi_info(tester.tti_info.tti_params.tti_rx, rnti1, cc_idxs[i], cqi);
}
generate_data(10, 1.0, 1.0);
generate_data(10, 1.0, 1.0, 1.0);
tester.test_next_ttis(generator.tti_events);
for (const auto& c : cc_idxs) {
TESTASSERT(tester.sched_stats->users[rnti1].tot_dl_sched_data[c] > 0);