diff --git a/srsenb/src/stack/mac/scheduler_grid.cc b/srsenb/src/stack/mac/scheduler_grid.cc index bfcb76748..7a995a01d 100644 --- a/srsenb/src/stack/mac/scheduler_grid.cc +++ b/srsenb/src/stack/mac/scheduler_grid.cc @@ -50,8 +50,7 @@ tti_params_t::tti_params_t(uint32_t tti_rx_) : tti_tx_dl(TTI_ADD(tti_rx, FDD_HARQ_DELAY_UL_MS)), tti_tx_ul(TTI_ADD(tti_rx, (FDD_HARQ_DELAY_UL_MS + FDD_HARQ_DELAY_DL_MS))), sfn_tx_dl(TTI_ADD(tti_rx, FDD_HARQ_DELAY_UL_MS) / 10) -{ -} +{} /******************************************************* * PDCCH Allocation Methods @@ -403,14 +402,6 @@ sf_grid_t::dl_ctrl_alloc_t sf_grid_t::alloc_dl_ctrl(uint32_t aggr_idx, alloc_typ //! Allocates CCEs and RBs for a user DL data alloc. alloc_outcome_t sf_grid_t::alloc_dl_data(sched_ue* user, const rbgmask_t& user_mask) { - // Check if allocation would cause segmentation - uint32_t ue_cc_idx = user->get_cell_index(cc_cfg->enb_cc_idx).second; - rbg_range_t r = user->get_required_dl_rbgs(ue_cc_idx); - if (r.rbg_min > user_mask.count()) { - log_h->warning("The number of RBGs allocated to rnti=0x%x will force segmentation\n", user->get_rnti()); - return alloc_outcome_t::NOF_RB_INVALID; - } - srslte_dci_format_t dci_format = user->get_dci_format(); uint32_t nof_bits = srslte_dci_format_sizeof(&cc_cfg->cfg.cell, nullptr, nullptr, dci_format); uint32_t aggr_idx = user->get_ue_carrier(cc_cfg->enb_cc_idx)->get_aggr_level(nof_bits); @@ -647,6 +638,18 @@ alloc_outcome_t sf_sched::alloc_dl_user(sched_ue* user, const rbgmask_t& user_ma return alloc_outcome_t::ERROR; } + // Check if allocation would cause segmentation + uint32_t ue_cc_idx = user->get_cell_index(cc_cfg->enb_cc_idx).second; + const dl_harq_proc& h = user->get_dl_harq(pid, ue_cc_idx); + if (h.is_empty()) { + // It is newTx + rbg_range_t r = user->get_required_dl_rbgs(ue_cc_idx); + if (r.rbg_min > user_mask.count()) { + log_h->warning("The number of RBGs allocated to rnti=0x%x will force segmentation\n", user->get_rnti()); + return alloc_outcome_t::NOF_RB_INVALID; + } + } + // Try to allocate RBGs and DCI alloc_outcome_t ret = tti_alloc.alloc_dl_data(user, user_mask); if (ret != alloc_outcome_t::SUCCESS) { diff --git a/srsenb/test/mac/scheduler_test_common.cc b/srsenb/test/mac/scheduler_test_common.cc index 454eeae43..490d3b8a5 100644 --- a/srsenb/test/mac/scheduler_test_common.cc +++ b/srsenb/test/mac/scheduler_test_common.cc @@ -306,7 +306,9 @@ ue_ctxt_test::ue_ctxt_test(uint16_t rnti_, uint32_t preamble_idx_, srslte::tti_point prach_tti_, const sched::ue_cfg_t& ue_cfg_, - const std::vector& cell_params_) : + const std::vector& cell_params_, + const ue_ctxt_test_cfg& cfg_) : + sim_cfg(cfg_), rnti(rnti_), prach_tti(prach_tti_), preamble_idx(preamble_idx_), @@ -351,7 +353,7 @@ int ue_ctxt_test::new_tti(sched* sched_ptr, srslte::tti_point tti_rx) current_tti_rx = tti_rx; TESTASSERT(fwd_pending_acks(sched_ptr) == SRSLTE_SUCCESS); - if ((tti_rx.to_uint() % cqi_Npd) == cqi_Noffset) { + if (sim_cfg.periodic_cqi and (tti_rx.to_uint() % sim_cfg.cqi_Npd) == sim_cfg.cqi_Noffset) { for (auto& cc : active_ccs) { sched_ptr->dl_cqi_info( tti_rx.to_uint(), rnti, cc.enb_cc_idx, std::uniform_int_distribution{5, 24}(get_rand_gen())); @@ -730,13 +732,15 @@ void user_state_sched_tester::new_tti(sched* sched_ptr, uint32_t tti_rx) int user_state_sched_tester::add_user(uint16_t rnti, uint32_t preamble_idx, - const srsenb::sched_interface::ue_cfg_t& ue_cfg) + const srsenb::sched_interface::ue_cfg_t& ue_cfg, + const ue_ctxt_test_cfg& cfg_) { CONDERROR(!srslte_prach_tti_opportunity_config_fdd( cell_params[ue_cfg.supported_cc_list[0].enb_cc_idx].prach_config, tic.tti_rx(), -1), "New user added in a non-PRACH TTI\n"); TESTASSERT(users.count(rnti) == 0); - ue_ctxt_test ue{rnti, preamble_idx, srslte::tti_point{tic.tti_rx()}, ue_cfg, cell_params}; + ue_ctxt_test_cfg cfg; + ue_ctxt_test ue{rnti, preamble_idx, srslte::tti_point{tic.tti_rx()}, ue_cfg, cell_params, cfg_}; users.insert(std::make_pair(rnti, ue)); return SRSLTE_SUCCESS; } @@ -901,7 +905,9 @@ int common_sched_tester::add_user(uint16_t rnti, const ue_cfg_t& ue_cfg_) uint32_t pcell_idx = ue_cfg_.supported_cc_list[0].enb_cc_idx; dl_rach_info(pcell_idx, rar_info); - ue_tester->add_user(rnti, rar_info.preamble_idx, ue_cfg_); + ue_ctxt_test_cfg ue_sim_cfg{}; + ue_sim_cfg.periodic_cqi = sim_args0.cqi_policy == sim_sched_args::cqi_gen_policy_t::periodic_random; + ue_tester->add_user(rnti, rar_info.preamble_idx, ue_cfg_, ue_sim_cfg); tester_log->info("Adding user rnti=0x%x\n", rnti); return SRSLTE_SUCCESS; diff --git a/srsenb/test/mac/scheduler_test_common.h b/srsenb/test/mac/scheduler_test_common.h index 5b21fd9c5..8871f2060 100644 --- a/srsenb/test/mac/scheduler_test_common.h +++ b/srsenb/test/mac/scheduler_test_common.h @@ -83,11 +83,16 @@ private: using dl_sched_res_list = std::vector; using ul_sched_res_list = std::vector; +struct ue_ctxt_test_cfg { + bool periodic_cqi = false; + uint32_t cqi_Npd = 10, cqi_Noffset = std::uniform_int_distribution{0, 10}(get_rand_gen()); // CQI reporting +}; + struct ue_ctxt_test { // args - srslte::log_ref log_h{"TEST"}; - uint32_t cqi_Npd = 10, cqi_Noffset = std::uniform_int_distribution{0, 10}(get_rand_gen()); // CQI reporting + srslte::log_ref log_h{"TEST"}; std::vector prob_dl_ack_mask{0.5, 0.5, 1}, prob_ul_ack_mask{0.5, 0.5, 1}; + ue_ctxt_test_cfg sim_cfg; // prach args uint16_t rnti; @@ -125,7 +130,8 @@ struct ue_ctxt_test { uint32_t preamble_idx_, srslte::tti_point prach_tti, const sched::ue_cfg_t& ue_cfg_, - const std::vector& cell_params_); + const std::vector& cell_params_, + const ue_ctxt_test_cfg& cfg_); int set_cfg(const sched::ue_cfg_t& ue_cfg_); cc_ue_ctxt_test* get_cc_state(uint32_t enb_cc_idx); @@ -181,7 +187,10 @@ public: } /* Config users */ - int add_user(uint16_t rnti, uint32_t preamble_idx, const srsenb::sched_interface::ue_cfg_t& ue_cfg); + int add_user(uint16_t rnti, + uint32_t preamble_idx, + const srsenb::sched_interface::ue_cfg_t& ue_cfg, + const ue_ctxt_test_cfg& cfg); int user_reconf(uint16_t rnti, const srsenb::sched_interface::ue_cfg_t& ue_cfg); int bearer_cfg(uint16_t rnti, uint32_t lcid, const srsenb::sched_interface::ue_bearer_cfg_t& bearer_cfg); void rem_user(uint16_t rnti); diff --git a/srsenb/test/mac/scheduler_test_rand.cc b/srsenb/test/mac/scheduler_test_rand.cc index 5419d457a..1f94412c8 100644 --- a/srsenb/test/mac/scheduler_test_rand.cc +++ b/srsenb/test/mac/scheduler_test_rand.cc @@ -451,11 +451,13 @@ sched_sim_events rand_sim_params(uint32_t nof_ttis) sched_sim_event_generator generator; - sim_gen.sim_args.cell_cfg = {generate_default_cell_cfg(nof_prb)}; - sim_gen.sim_args.ue_cfg = generate_default_ue_cfg(); - sim_gen.sim_args.P_retx = 0.1; - sim_gen.sim_args.start_tti = 0; - sim_gen.sim_args.sim_log = log_global.get(); + sim_gen.sim_args.cell_cfg = {generate_default_cell_cfg(nof_prb)}; + sim_gen.sim_args.ue_cfg = generate_default_ue_cfg(); + sim_gen.sim_args.P_retx = 0.1; + sim_gen.sim_args.start_tti = 0; + sim_gen.sim_args.sim_log = log_global.get(); + sim_gen.sim_args.cqi_policy = sim_sched_args::cqi_gen_policy_t::periodic_random; + generator.tti_events.resize(nof_ttis); for (uint32_t tti = 0; tti < nof_ttis; ++tti) { diff --git a/srsenb/test/mac/scheduler_test_utils.h b/srsenb/test/mac/scheduler_test_utils.h index 59c73b876..d93f3551c 100644 --- a/srsenb/test/mac/scheduler_test_utils.h +++ b/srsenb/test/mac/scheduler_test_utils.h @@ -156,7 +156,8 @@ struct sim_sched_args { float P_retx; srsenb::sched_interface::ue_cfg_t ue_cfg; std::vector cell_cfg; - srslte::log* sim_log = nullptr; + srslte::log* sim_log = nullptr; + enum class cqi_gen_policy_t { none, periodic_random } cqi_policy = cqi_gen_policy_t::none; }; // generate all events up front