diff --git a/srsenb/test/mac/sched_ue_ded_test_suite.cc b/srsenb/test/mac/sched_ue_ded_test_suite.cc index 7fede9686..e64199ee0 100644 --- a/srsenb/test/mac/sched_ue_ded_test_suite.cc +++ b/srsenb/test/mac/sched_ue_ded_test_suite.cc @@ -176,10 +176,10 @@ int test_ul_sched_result(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t& int test_ra(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t& sf_out) { for (uint32_t cc = 0; cc < enb_ctxt.cell_params->size(); ++cc) { + const auto& dl_cc_res = sf_out.dl_cc_result[cc]; + const auto& ul_cc_res = sf_out.ul_cc_result[cc]; for (const auto& ue_pair : enb_ctxt.ue_db) { const auto& ue = *ue_pair.second; - const auto& dl_cc_res = sf_out.dl_cc_result[cc]; - const auto& ul_cc_res = sf_out.ul_cc_result[cc]; uint16_t rnti = ue.rnti; uint32_t ue_cc_idx = ue.enb_to_ue_cc_idx(cc); @@ -282,6 +282,21 @@ int test_ra(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t& sf_out) } } } + + // TEST: Ensure there are no spurious RARs that do not belong to any user + for (uint32_t i = 0; i < dl_cc_res.nof_rar_elems; ++i) { + for (uint32_t j = 0; j < dl_cc_res.rar[i].nof_grants; ++j) { + uint32_t prach_tti = dl_cc_res.rar[i].msg3_grant[j].data.prach_tti; + uint32_t preamble_idx = dl_cc_res.rar[i].msg3_grant[j].data.preamble_idx; + auto it = std::find_if( + enb_ctxt.ue_db.begin(), enb_ctxt.ue_db.end(), [&](const std::pair& u) { + const auto& ctxt = *u.second; + return ctxt.preamble_idx == preamble_idx and ((uint32_t)ctxt.prach_tti_rx.to_uint() == prach_tti); + }); + CONDERROR(it == enb_ctxt.ue_db.end(), "There was a RAR allocation with no associated user"); + CONDERROR(it->second->ue_cfg.supported_cc_list[0].enb_cc_idx != cc, "The allocated RAR is in the wrong cc\n"); + } + } } return SRSLTE_SUCCESS; diff --git a/srsenb/test/mac/sched_ue_ded_test_suite.h b/srsenb/test/mac/sched_ue_ded_test_suite.h index 802ae220f..8f8d97fc7 100644 --- a/srsenb/test/mac/sched_ue_ded_test_suite.h +++ b/srsenb/test/mac/sched_ue_ded_test_suite.h @@ -64,6 +64,8 @@ int test_ul_sched_result(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t& * - Msg3 is allocated in expected TTI, without PDCCH, and PRBs advertised in RAR * - First Data allocation happens after Msg3 is ACKed, and contains a ConRes CE * - No RARs are allocated with wrong enb_cc_idx, preamble_idx or wrong user + * - All RARs belong to a user that just PRACHed + * - All DL/UL data allocs have a valid RNTI */ int test_ra(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t& sf_out); diff --git a/srsenb/test/mac/scheduler_test_common.cc b/srsenb/test/mac/scheduler_test_common.cc index 9afea19f8..0ef86b4b2 100644 --- a/srsenb/test/mac/scheduler_test_common.cc +++ b/srsenb/test/mac/scheduler_test_common.cc @@ -57,15 +57,12 @@ std::default_random_engine& ::srsenb::get_rand_gen() ***********************/ ue_ctxt_test::ue_ctxt_test(uint16_t rnti_, - uint32_t preamble_idx_, srslte::tti_point prach_tti_, const ue_ctxt_test_cfg& cfg_, const std::vector& cell_params_, ue_sim& ue_ctxt_) : sim_cfg(cfg_), rnti(rnti_), - prach_tti(prach_tti_), - preamble_idx(preamble_idx_), cell_params(cell_params_), current_tti_rx(prach_tti_), ue_ctxt(&ue_ctxt_) @@ -271,7 +268,7 @@ int user_state_sched_tester::add_user(uint16_t rnti, uint32_t preamble_idx, cons TESTASSERT(users.count(rnti) == 0); sim_users.add_user(rnti, cfg_.ue_cfg, tic, preamble_idx); - ue_ctxt_test ue{rnti, preamble_idx, tic, cfg_, cell_params, sim_users.at(rnti)}; + ue_ctxt_test ue{rnti, tic, cfg_, cell_params, sim_users.at(rnti)}; users.insert(std::make_pair(rnti, ue)); return SRSLTE_SUCCESS; @@ -307,32 +304,6 @@ void user_state_sched_tester::rem_user(uint16_t rnti) sim_users.rem_user(rnti); } -/** - * Individual tests: - * - All RARs belong to a user that just PRACHed - * - All DL/UL data allocs have a valid RNTI - */ -int user_state_sched_tester::test_ctrl_info(uint32_t enb_cc_idx, - const sched_interface::dl_sched_res_t& dl_result, - const sched_interface::ul_sched_res_t& ul_result) -{ - /* TEST: Ensure there are no spurious RARs that do not belong to any user */ - for (uint32_t i = 0; i < dl_result.nof_rar_elems; ++i) { - for (uint32_t j = 0; j < dl_result.rar[i].nof_grants; ++j) { - uint32_t prach_tti = dl_result.rar[i].msg3_grant[j].data.prach_tti; - uint32_t preamble_idx = dl_result.rar[i].msg3_grant[j].data.preamble_idx; - auto it = std::find_if(users.begin(), users.end(), [&](const std::pair& u) { - return u.second.preamble_idx == preamble_idx and ((uint32_t)u.second.prach_tti.to_uint() == prach_tti); - }); - CONDERROR(it == users.end(), "There was a RAR allocation with no associated user"); - CONDERROR(it->second.user_cfg.supported_cc_list[0].enb_cc_idx != enb_cc_idx, - "The allocated RAR is in the wrong cc\n"); - } - } - - return SRSLTE_SUCCESS; -} - int user_state_sched_tester::test_all(const sf_output_res_t& sf_out, uint32_t enb_cc_idx) { // Perform UE-dedicated sched result tests @@ -344,9 +315,6 @@ int user_state_sched_tester::test_all(const sf_output_res_t& sf_out, uint32_t en // Update Simulated UEs state sim_users.update(sf_out); - TESTASSERT(test_ctrl_info(enb_cc_idx, sf_out.dl_cc_result[enb_cc_idx], sf_out.ul_cc_result[enb_cc_idx]) == - SRSLTE_SUCCESS); - for (auto& u : users) { TESTASSERT(u.second.test_sched_result( enb_cc_idx, sf_out.dl_cc_result[enb_cc_idx], sf_out.ul_cc_result[enb_cc_idx]) == SRSLTE_SUCCESS); @@ -512,26 +480,31 @@ int common_sched_tester::process_tti_events(const tti_ev& tti_ev) const ue_ctxt_test* user = ue_tester->get_user_ctxt(ue_ev.rnti); - if (user != nullptr and not user->msg4_tti.is_valid() and user->msg3_tti.is_valid() and user->msg3_tti <= tic) { - // Msg3 has been received but Msg4 has not been yet transmitted - // Setup default UE config - reconf_user(user->rnti, generate_setup_ue_cfg(sim_args0.default_ue_sim_cfg.ue_cfg)); - - // Schedule RRC Setup and ConRes CE - uint32_t pending_dl_new_data = ue_db[ue_ev.rnti].get_pending_dl_new_data(); - if (pending_dl_new_data == 0) { - uint32_t lcid = RB_ID_SRB0; // Use SRB0 to schedule Msg4 - dl_rlc_buffer_state(ue_ev.rnti, lcid, 50, 0); - dl_mac_buffer_state(ue_ev.rnti, (uint32_t)srslte::dl_sch_lcid::CON_RES_ID); - } else { - // Let SRB0 Msg4 get fully transmitted + if (user != nullptr) { + const auto& ue_sim_ctxt = user->ue_ctxt->get_ctxt(); + if (not ue_sim_ctxt.msg4_tti_rx.is_valid() and ue_sim_ctxt.msg3_tti_rx.is_valid() and + to_tx_ul(ue_sim_ctxt.msg3_tti_rx) <= tic) { + // Msg3 has been received but Msg4 has not been yet transmitted + // Setup default UE config + reconf_user(user->rnti, generate_setup_ue_cfg(sim_args0.default_ue_sim_cfg.ue_cfg)); + + // Schedule RRC Setup and ConRes CE + uint32_t pending_dl_new_data = ue_db[ue_ev.rnti].get_pending_dl_new_data(); + if (pending_dl_new_data == 0) { + uint32_t lcid = RB_ID_SRB0; // Use SRB0 to schedule Msg4 + dl_rlc_buffer_state(ue_ev.rnti, lcid, 50, 0); + dl_mac_buffer_state(ue_ev.rnti, (uint32_t)srslte::dl_sch_lcid::CON_RES_ID); + } else { + // Let SRB0 Msg4 get fully transmitted + } } } // push UL SRs and DL packets if (ue_ev.buffer_ev != nullptr) { CONDERROR(user == nullptr, "TESTER ERROR: Trying to schedule data for user that does not exist\n"); - if (ue_ev.buffer_ev->dl_data > 0 and user->msg4_tti.is_valid()) { + const auto& ue_sim_ctxt = user->ue_ctxt->get_ctxt(); + if (ue_ev.buffer_ev->dl_data > 0 and ue_sim_ctxt.msg4_tti_rx.is_valid()) { // If Msg4 has already been tx and there DL data to transmit uint32_t lcid = RB_ID_DRB1; uint32_t pending_dl_new_data = ue_db[ue_ev.rnti].get_pending_dl_new_data(); diff --git a/srsenb/test/mac/scheduler_test_common.h b/srsenb/test/mac/scheduler_test_common.h index 8bbfd2da3..1989faa5b 100644 --- a/srsenb/test/mac/scheduler_test_common.h +++ b/srsenb/test/mac/scheduler_test_common.h @@ -51,26 +51,21 @@ struct ue_ctxt_test { // prach args uint16_t rnti; - uint32_t preamble_idx = 0; /* state */ srsenb::sched_interface::ue_cfg_t user_cfg; srslte::tti_point current_tti_rx; - // RA state - srslte::tti_point prach_tti, rar_tti, msg3_tti, msg4_tti; - uint32_t msg3_riv = 0; - struct cc_ue_ctxt_test { uint32_t ue_cc_idx = 0; uint32_t enb_cc_idx = 0; }; std::vector active_ccs; + ue_sim* ue_ctxt; bool drb_cfg_flag = false; ue_ctxt_test(uint16_t rnti_, - uint32_t preamble_idx_, srslte::tti_point prach_tti, const ue_ctxt_test_cfg& cfg_, const std::vector& cell_params_, @@ -78,7 +73,6 @@ struct ue_ctxt_test { int set_cfg(const sched::ue_cfg_t& ue_cfg_); cc_ue_ctxt_test* get_cc_state(uint32_t enb_cc_idx); - bool is_msg3_rx(const srslte::tti_point& tti_rx) const { return msg3_tti.is_valid() and msg3_tti <= tti_rx; } int new_tti(sched* sched_ptr, srslte::tti_point tti_rx); int test_sched_result(uint32_t enb_cc_idx, @@ -106,7 +100,6 @@ private: bool operator<(const pending_ack_t& other) const { return tti_ack > other.tti_ack; } }; std::priority_queue pending_dl_acks, pending_ul_acks; - ue_sim* ue_ctxt; }; class user_state_sched_tester @@ -133,11 +126,6 @@ public: 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); - /* Test allocs control content */ - int test_ctrl_info(uint32_t enb_cc_idx, - const sched_interface::dl_sched_res_t& dl_result, - const sched_interface::ul_sched_res_t& ul_result); - int test_all(const sf_output_res_t& sf_out, uint32_t enb_cc_idx); private: