mirror of https://github.com/PentHertz/srsLTE.git
use initial_dl_cqi for first DL tx.
This commit is contained in:
parent
ab69c6fe43
commit
bcbb08ebae
|
@ -50,7 +50,7 @@ struct sched_ue_carrier {
|
||||||
uint32_t get_required_prb_ul(uint32_t req_bytes);
|
uint32_t get_required_prb_ul(uint32_t req_bytes);
|
||||||
const sched_cell_params_t* get_cell_cfg() const { return cell_params; }
|
const sched_cell_params_t* get_cell_cfg() const { return cell_params; }
|
||||||
bool is_active() const { return active; }
|
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;
|
harq_entity harq_ent;
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ struct sched_ue_carrier {
|
||||||
uint32_t dl_cqi_tti = 0;
|
uint32_t dl_cqi_tti = 0;
|
||||||
uint32_t ul_cqi = 1;
|
uint32_t ul_cqi = 1;
|
||||||
uint32_t ul_cqi_tti = 0;
|
uint32_t ul_cqi_tti = 0;
|
||||||
|
bool dl_cqi_rx = false;
|
||||||
|
|
||||||
int max_mcs_dl = 28, max_mcs_ul = 28;
|
int max_mcs_dl = 28, max_mcs_ul = 28;
|
||||||
uint32_t max_aggr_level = 3;
|
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);
|
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);
|
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_dl_new_data();
|
||||||
uint32_t get_pending_ul_new_data(uint32_t tti);
|
uint32_t get_pending_ul_new_data(uint32_t tti);
|
||||||
|
|
|
@ -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);
|
h = user->get_empty_dl_harq(tti_dl, cell_idx);
|
||||||
if (h != nullptr) {
|
if (h != nullptr) {
|
||||||
// Allocate resources based on pending data
|
// 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) {
|
if (req_rbgs.first > 0) {
|
||||||
rbgmask_t newtx_mask(tti_alloc->get_dl_mask().size());
|
rbgmask_t newtx_mask(tti_alloc->get_dl_mask().size());
|
||||||
if (find_allocation(req_rbgs.first, req_rbgs.second, &newtx_mask)) {
|
if (find_allocation(req_rbgs.first, req_rbgs.second, &newtx_mask)) {
|
||||||
|
|
|
@ -44,7 +44,8 @@ namespace srsenb {
|
||||||
|
|
||||||
namespace sched_utils {
|
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}
|
//! 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)
|
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);
|
auto p = get_cell_index(enb_cc_idx);
|
||||||
if (p.second != std::numeric_limits<uint32_t>::max()) {
|
if (p.second != std::numeric_limits<uint32_t>::max()) {
|
||||||
carriers[p.second].dl_cqi = cqi;
|
carriers[p.second].set_dl_cqi(tti, cqi);
|
||||||
carriers[p.second].dl_cqi_tti = tti;
|
|
||||||
carriers[p.second].update_cell_activity();
|
|
||||||
} else {
|
} else {
|
||||||
log_h->warning("Received DL CQI for invalid cell index %d\n", enb_cc_idx);
|
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);
|
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
|
// 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
|
// 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
|
// Dynamic MCS
|
||||||
tbs_bytes = carriers[ue_cc_idx].alloc_tbs_dl(nof_alloc_prbs, nof_re, req_bytes.second, &mcs);
|
tbs_bytes = carriers[ue_cc_idx].alloc_tbs_dl(nof_alloc_prbs, nof_re, req_bytes.second, &mcs);
|
||||||
} else {
|
} else {
|
||||||
// Fixed MCS
|
// 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
|
// 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;
|
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);
|
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) {
|
if (req_bytes.first == 0 and req_bytes.second == 0) {
|
||||||
return {0, 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);
|
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 = 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);
|
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};
|
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_retx);
|
||||||
srb0_data += compute_sdu_total_bytes(0, lch[0].buf_tx);
|
srb0_data += compute_sdu_total_bytes(0, lch[0].buf_tx);
|
||||||
if (conres_ce_pending) {
|
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
|
// 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)
|
harq_ent(SCHED_MAX_HARQ_PROC, SCHED_MAX_HARQ_PROC)
|
||||||
{
|
{
|
||||||
// only PCell starts active. Remaining ones wait for valid CQI
|
// only PCell starts active. Remaining ones wait for valid CQI
|
||||||
active = ue_cc_idx == 0;
|
active = ue_cc_idx == 0;
|
||||||
dl_cqi = (ue_cc_idx == 0) ? 1 : 0;
|
dl_cqi_rx = false;
|
||||||
|
dl_cqi = (ue_cc_idx == 0) ? sched_utils::initial_dl_cqi : 0;
|
||||||
|
|
||||||
// set max mcs
|
// set max mcs
|
||||||
max_mcs_ul = cell_params->sched_cfg->pusch_max_mcs >= 0 ? cell_params->sched_cfg->pusch_max_mcs : 28;
|
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;
|
uint32_t n;
|
||||||
for (n = 0; n < cell_params->nof_prb() and nbytes < req_bytes; ++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);
|
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);
|
tbs = alloc_tbs_dl(n + 1, nof_re, 0, &mcs);
|
||||||
} else {
|
} else {
|
||||||
tbs = srslte_ra_tbs_from_idx(srslte_ra_tbs_idx_from_mcs(fixed_mcs_dl, false), n + 1) / 8;
|
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)
|
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;
|
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 (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;
|
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");
|
log_h->info("SCell index=%d is now %s\n", ue_cc_idx, active ? "active" : "inactive");
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,21 +142,21 @@ int test_scell_activation(test_scell_activation_params params)
|
||||||
tester.test_next_ttis(generator.tti_events);
|
tester.test_next_ttis(generator.tti_events);
|
||||||
|
|
||||||
// Event (20 TTIs): Data back and forth
|
// 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) {
|
for (uint32_t i = 0; i < nof_ttis; ++i) {
|
||||||
generator.step_tti();
|
generator.step_tti();
|
||||||
bool ul_flag = randf() < prob_ul, dl_flag = randf() < prob_dl;
|
bool ul_flag = randf() < prob_ul, dl_flag = randf() < prob_dl;
|
||||||
if (dl_flag) {
|
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));
|
generator.add_dl_data(rnti1, pow(10, exp));
|
||||||
}
|
}
|
||||||
if (ul_flag) {
|
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));
|
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);
|
tester.test_next_ttis(generator.tti_events);
|
||||||
|
|
||||||
// Event: Reconf Complete. Activate SCells. Check if CE correctly transmitted
|
// 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
|
// 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);
|
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);
|
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_dl_sched_data[params.pcell_idx] > 0);
|
||||||
TESTASSERT(tester.sched_stats->users[rnti1].tot_ul_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) {
|
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);
|
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);
|
tester.test_next_ttis(generator.tti_events);
|
||||||
for (const auto& c : cc_idxs) {
|
for (const auto& c : cc_idxs) {
|
||||||
TESTASSERT(tester.sched_stats->users[rnti1].tot_dl_sched_data[c] > 0);
|
TESTASSERT(tester.sched_stats->users[rnti1].tot_dl_sched_data[c] > 0);
|
||||||
|
|
Loading…
Reference in New Issue