sched rand tester refactor: elimination of ue_ctxt_test obsolete class

master
Francisco 4 years ago committed by Andre Puschmann
parent a068ae11b0
commit aed36eb273

@ -125,8 +125,8 @@ int test_scell_activation(test_scell_activation_params params)
TESTASSERT(tester.ue_tester->user_exists(rnti1)); TESTASSERT(tester.ue_tester->user_exists(rnti1));
// Event (TTI=prach_tti+msg4_tot_delay): First Tx (Msg4). Goes in SRB0 and contains ConRes // Event (TTI=prach_tti+msg4_tot_delay): First Tx (Msg4). Goes in SRB0 and contains ConRes
while (not tester.ue_tester->get_user_ctxt(rnti1)->ue_ctxt->get_ctxt().msg3_tti_rx.is_valid() or while (not tester.ue_tester->get_user_ctxt(rnti1)->get_ctxt().msg3_tti_rx.is_valid() or
srsenb::to_tx_ul(tester.ue_tester->get_user_ctxt(rnti1)->ue_ctxt->get_ctxt().msg3_tti_rx).to_uint() > srsenb::to_tx_ul(tester.ue_tester->get_user_ctxt(rnti1)->get_ctxt().msg3_tti_rx).to_uint() >
generator.tti_counter) { generator.tti_counter) {
generator.step_tti(); generator.step_tti();
tester.test_next_ttis(generator.tti_events); tester.test_next_ttis(generator.tti_events);
@ -134,7 +134,7 @@ int test_scell_activation(test_scell_activation_params params)
generator.step_tti(); generator.step_tti();
generator.add_dl_data(rnti1, msg4_size); generator.add_dl_data(rnti1, msg4_size);
tester.test_next_ttis(generator.tti_events); tester.test_next_ttis(generator.tti_events);
while (not tester.ue_tester->get_user_ctxt(rnti1)->ue_ctxt->get_ctxt().conres_rx) { while (not tester.ue_tester->get_user_ctxt(rnti1)->get_ctxt().conres_rx) {
generator.step_tti(); generator.step_tti();
tester.test_next_ttis(generator.tti_events); tester.test_next_ttis(generator.tti_events);
} }

@ -144,6 +144,9 @@ public:
return it != ue_db.end() ? &it->second : nullptr; return it != ue_db.end() ? &it->second : nullptr;
} }
std::map<uint16_t, ue_sim>::iterator begin() { return ue_db.begin(); }
std::map<uint16_t, ue_sim>::iterator end() { return ue_db.end(); }
private: private:
const std::vector<sched_interface::cell_cfg_t>* cell_params; const std::vector<sched_interface::cell_cfg_t>* cell_params;
std::map<uint16_t, ue_sim> ue_db; std::map<uint16_t, ue_sim> ue_db;

@ -48,50 +48,43 @@ std::default_random_engine& ::srsenb::get_rand_gen()
* User State Tester * User State Tester
***********************/ ***********************/
ue_ctxt_test::ue_ctxt_test(const ue_ctxt_test_cfg& cfg_, ue_sim& ue_ctxt_) : sim_cfg(cfg_), ue_ctxt(&ue_ctxt_) {} void user_state_sched_tester::new_tti(sched* sched_ptr, tti_point tti_rx)
int ue_ctxt_test::new_tti(sched* sched_ptr, srslte::tti_point tti_rx)
{ {
auto pending_feedback = ue_ctxt->get_pending_events(tti_rx, sched_ptr); tic++;
for (auto& u : sim_users) {
for (uint32_t enb_cc_idx = 0; enb_cc_idx < pending_feedback->cc_list.size(); ++enb_cc_idx) { auto pending_feedback = u.second.get_pending_events(tti_rx, sched_ptr);
auto& cc_feedback = pending_feedback->cc_list[enb_cc_idx]; auto& ctxt = u.second.get_ctxt();
if (not cc_feedback.configured) { const auto& sim_cfg = ue_sim_cfg_map.at(u.first);
continue;
} for (uint32_t enb_cc_idx = 0; enb_cc_idx < pending_feedback->cc_list.size(); ++enb_cc_idx) {
auto& cc_feedback = pending_feedback->cc_list[enb_cc_idx];
if (not cc_feedback.configured) {
continue;
}
// ACK DL HARQs // ACK DL HARQs
if (cc_feedback.dl_pid >= 0) { if (cc_feedback.dl_pid >= 0) {
auto& h = ue_ctxt->get_ctxt().cc_list[cc_feedback.ue_cc_idx].dl_harqs[cc_feedback.dl_pid]; auto& h = ctxt.cc_list[cc_feedback.ue_cc_idx].dl_harqs[cc_feedback.dl_pid];
cc_feedback.dl_ack = randf() < sim_cfg.prob_dl_ack_mask[h.nof_retxs % sim_cfg.prob_dl_ack_mask.size()]; cc_feedback.dl_ack = randf() < sim_cfg.prob_dl_ack_mask[h.nof_retxs % sim_cfg.prob_dl_ack_mask.size()];
} }
// ACK UL HARQs // ACK UL HARQs
if (cc_feedback.ul_pid >= 0) { if (cc_feedback.ul_pid >= 0) {
auto& h = ue_ctxt->get_ctxt().cc_list[cc_feedback.ue_cc_idx].ul_harqs[cc_feedback.ul_pid]; auto& h = ctxt.cc_list[cc_feedback.ue_cc_idx].ul_harqs[cc_feedback.ul_pid];
cc_feedback.ul_ack = randf() < sim_cfg.prob_ul_ack_mask[h.nof_retxs % sim_cfg.prob_ul_ack_mask.size()]; cc_feedback.ul_ack = randf() < sim_cfg.prob_ul_ack_mask[h.nof_retxs % sim_cfg.prob_ul_ack_mask.size()];
} }
// DL CQI // DL CQI
if (cc_feedback.dl_cqi >= 0) { if (cc_feedback.dl_cqi >= 0) {
cc_feedback.dl_cqi = std::uniform_int_distribution<uint32_t>{5, 24}(get_rand_gen()); cc_feedback.dl_cqi = std::uniform_int_distribution<uint32_t>{5, 24}(get_rand_gen());
} }
// UL CQI // UL CQI
if (cc_feedback.ul_cqi >= 0) { if (cc_feedback.ul_cqi >= 0) {
cc_feedback.ul_cqi = std::uniform_int_distribution<uint32_t>{5, 40}(get_rand_gen()); cc_feedback.ul_cqi = std::uniform_int_distribution<uint32_t>{5, 40}(get_rand_gen());
}
} }
} }
return SRSLTE_SUCCESS;
}
void user_state_sched_tester::new_tti(sched* sched_ptr, tti_point tti_rx)
{
tic++;
for (auto& u : users) {
u.second.new_tti(sched_ptr, tti_rx);
}
} }
int user_state_sched_tester::add_user(uint16_t rnti, uint32_t preamble_idx, const ue_ctxt_test_cfg& cfg_) int user_state_sched_tester::add_user(uint16_t rnti, uint32_t preamble_idx, const ue_ctxt_test_cfg& cfg_)
@ -99,18 +92,16 @@ int user_state_sched_tester::add_user(uint16_t rnti, uint32_t preamble_idx, cons
CONDERROR(!srslte_prach_tti_opportunity_config_fdd( CONDERROR(!srslte_prach_tti_opportunity_config_fdd(
cell_params[cfg_.ue_cfg.supported_cc_list[0].enb_cc_idx].prach_config, tic.to_uint(), -1), cell_params[cfg_.ue_cfg.supported_cc_list[0].enb_cc_idx].prach_config, tic.to_uint(), -1),
"New user added in a non-PRACH TTI\n"); "New user added in a non-PRACH TTI\n");
TESTASSERT(users.count(rnti) == 0); TESTASSERT(sim_users.find_rnti(rnti) == nullptr);
sim_users.add_user(rnti, generate_rach_ue_cfg(cfg_.ue_cfg), tic, preamble_idx); sim_users.add_user(rnti, generate_rach_ue_cfg(cfg_.ue_cfg), tic, preamble_idx);
ue_sim_cfg_map[rnti] = cfg_;
ue_ctxt_test ue{cfg_, sim_users.at(rnti)};
users.insert(std::make_pair(rnti, ue));
return SRSLTE_SUCCESS; return SRSLTE_SUCCESS;
} }
int user_state_sched_tester::user_reconf(uint16_t rnti, const srsenb::sched_interface::ue_cfg_t& ue_cfg) int user_state_sched_tester::user_reconf(uint16_t rnti, const srsenb::sched_interface::ue_cfg_t& ue_cfg)
{ {
TESTASSERT(users.count(rnti) > 0); TESTASSERT(sim_users.find_rnti(rnti) != nullptr);
sim_users.ue_recfg(rnti, ue_cfg); sim_users.ue_recfg(rnti, ue_cfg);
return SRSLTE_SUCCESS; return SRSLTE_SUCCESS;
} }
@ -120,22 +111,24 @@ int user_state_sched_tester::bearer_cfg(uint16_t
const srsenb::sched_interface::ue_bearer_cfg_t& bearer_cfg) const srsenb::sched_interface::ue_bearer_cfg_t& bearer_cfg)
{ {
sim_users.bearer_cfg(rnti, lcid, bearer_cfg); sim_users.bearer_cfg(rnti, lcid, bearer_cfg);
ue_sim* ue = sim_users.find_rnti(rnti); return SRSLTE_SUCCESS;
auto it = users.find(rnti); }
TESTASSERT(it != users.end());
users.at(rnti).drb_cfg_flag = false; bool user_state_sched_tester::is_drb_cfg(uint16_t rnti) const
for (uint32_t i = 2; i < ue->get_ctxt().ue_cfg.ue_bearers.size(); ++i) { {
if (ue->get_ctxt().ue_cfg.ue_bearers[i].direction != sched_interface::ue_bearer_cfg_t::IDLE) { const ue_sim& ue = sim_users.at(rnti);
users.at(rnti).drb_cfg_flag = true; for (uint32_t i = 2; i < ue.get_ctxt().ue_cfg.ue_bearers.size(); ++i) {
if (ue.get_ctxt().ue_cfg.ue_bearers[i].direction != sched_interface::ue_bearer_cfg_t::IDLE) {
return true;
} }
} }
return SRSLTE_SUCCESS; return false;
} }
void user_state_sched_tester::rem_user(uint16_t rnti) void user_state_sched_tester::rem_user(uint16_t rnti)
{ {
users.erase(rnti);
sim_users.rem_user(rnti); sim_users.rem_user(rnti);
ue_sim_cfg_map.erase(rnti);
} }
int user_state_sched_tester::test_all(const sf_output_res_t& sf_out) int user_state_sched_tester::test_all(const sf_output_res_t& sf_out)
@ -302,10 +295,10 @@ int common_sched_tester::process_tti_events(const tti_ev& tti_ev)
bearer_ue_cfg(ue_ev.rnti, 0, ue_ev.bearer_cfg.get()); bearer_ue_cfg(ue_ev.rnti, 0, ue_ev.bearer_cfg.get());
} }
const ue_ctxt_test* user = ue_tester->get_user_ctxt(ue_ev.rnti); const ue_sim* user = ue_tester->get_user_ctxt(ue_ev.rnti);
if (user != nullptr) { if (user != nullptr) {
const auto& ue_sim_ctxt = user->ue_ctxt->get_ctxt(); const auto& ue_sim_ctxt = user->get_ctxt();
if (not ue_sim_ctxt.msg4_tti_rx.is_valid() and ue_sim_ctxt.msg3_tti_rx.is_valid() and 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) <= tti_rx) { to_tx_ul(ue_sim_ctxt.msg3_tti_rx) <= tti_rx) {
// Msg3 has been received but Msg4 has not been yet transmitted // Msg3 has been received but Msg4 has not been yet transmitted
@ -327,14 +320,14 @@ int common_sched_tester::process_tti_events(const tti_ev& tti_ev)
// push UL SRs and DL packets // push UL SRs and DL packets
if (ue_ev.buffer_ev != nullptr) { if (ue_ev.buffer_ev != nullptr) {
CONDERROR(user == nullptr, "TESTER ERROR: Trying to schedule data for user that does not exist\n"); CONDERROR(user == nullptr, "TESTER ERROR: Trying to schedule data for user that does not exist\n");
const auto& ue_sim_ctxt = user->ue_ctxt->get_ctxt(); const auto& ue_sim_ctxt = user->get_ctxt();
if (ue_ev.buffer_ev->dl_data > 0 and ue_sim_ctxt.msg4_tti_rx.is_valid()) { 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 // If Msg4 has already been tx and there DL data to transmit
uint32_t lcid = RB_ID_DRB1; uint32_t lcid = RB_ID_DRB1;
uint32_t pending_dl_new_data = ue_db[ue_ev.rnti].get_pending_dl_rlc_data(); uint32_t pending_dl_new_data = ue_db[ue_ev.rnti].get_pending_dl_rlc_data();
if (user->drb_cfg_flag or pending_dl_new_data == 0) { if (ue_tester->is_drb_cfg(ue_ev.rnti) or pending_dl_new_data == 0) {
// If RRCSetup finished // If RRCSetup finished
if (not user->drb_cfg_flag) { if (not ue_tester->is_drb_cfg(ue_ev.rnti)) {
reconf_user(ue_sim_ctxt.rnti, sim_args0.default_ue_sim_cfg.ue_cfg); reconf_user(ue_sim_ctxt.rnti, sim_args0.default_ue_sim_cfg.ue_cfg);
// setup lcid==drb1 bearer // setup lcid==drb1 bearer
sched::ue_bearer_cfg_t cfg = {}; sched::ue_bearer_cfg_t cfg = {};
@ -351,7 +344,7 @@ int common_sched_tester::process_tti_events(const tti_ev& tti_ev)
} }
} }
if (ue_ev.buffer_ev->sr_data > 0 and user->drb_cfg_flag) { if (ue_ev.buffer_ev->sr_data > 0 and ue_tester->is_drb_cfg(ue_ev.rnti)) {
uint32_t tot_ul_data = uint32_t tot_ul_data =
ue_db[ue_ev.rnti].get_pending_ul_new_data(to_tx_ul(tti_rx), -1) + ue_ev.buffer_ev->sr_data; ue_db[ue_ev.rnti].get_pending_ul_new_data(to_tx_ul(tti_rx), -1) + ue_ev.buffer_ev->sr_data;
uint32_t lcg = 1; uint32_t lcg = 1;

@ -35,20 +35,6 @@ std::default_random_engine& get_rand_gen();
using dl_sched_res_list = std::vector<sched_interface::dl_sched_res_t>; using dl_sched_res_list = std::vector<sched_interface::dl_sched_res_t>;
using ul_sched_res_list = std::vector<sched_interface::ul_sched_res_t>; using ul_sched_res_list = std::vector<sched_interface::ul_sched_res_t>;
struct ue_ctxt_test {
// args
srslte::log_ref log_h{"TEST"};
ue_ctxt_test_cfg sim_cfg;
ue_sim* ue_ctxt;
bool drb_cfg_flag = false;
ue_ctxt_test(const ue_ctxt_test_cfg& cfg_, ue_sim& ue_ctxt_);
int new_tti(sched* sched_ptr, srslte::tti_point tti_rx);
};
class user_state_sched_tester class user_state_sched_tester
{ {
public: public:
@ -56,15 +42,13 @@ public:
cell_params(cell_params_), sim_users(cell_params_) cell_params(cell_params_), sim_users(cell_params_)
{} {}
void new_tti(sched* sched_ptr, tti_point tti_rx); void new_tti(sched* sched_ptr, tti_point tti_rx);
bool user_exists(uint16_t rnti) const { return users.find(rnti) != users.end(); } bool user_exists(uint16_t rnti) const { return sim_users.find_rnti(rnti) != nullptr; }
const ue_ctxt_test* get_user_ctxt(uint16_t rnti) const const ue_sim* get_user_ctxt(uint16_t rnti) const { return sim_users.find_rnti(rnti); }
{
return users.count(rnti) > 0 ? &users.find(rnti)->second : nullptr;
}
const sched::ue_cfg_t* get_user_cfg(uint16_t rnti) const const sched::ue_cfg_t* get_user_cfg(uint16_t rnti) const
{ {
return users.count(rnti) > 0 ? &sim_users.at(rnti).get_ctxt().ue_cfg : nullptr; const ue_sim* ue = get_user_ctxt(rnti);
return ue == nullptr ? nullptr : &ue->get_ctxt().ue_cfg;
} }
/* Config users */ /* Config users */
@ -75,12 +59,14 @@ public:
int test_all(const sf_output_res_t& sf_out); int test_all(const sf_output_res_t& sf_out);
bool is_drb_cfg(uint16_t rnti) const;
private: private:
const std::vector<srsenb::sched::cell_cfg_t>& cell_params; const std::vector<srsenb::sched::cell_cfg_t>& cell_params;
ue_db_sim sim_users; ue_db_sim sim_users;
std::map<uint16_t, ue_ctxt_test> users; std::map<uint16_t, ue_ctxt_test_cfg> ue_sim_cfg_map;
srslte::tti_point tic; srslte::tti_point tic;
}; };
class sched_result_stats class sched_result_stats

@ -87,7 +87,7 @@ int test_pdsch_grant(const sim_enb_ctxt_t& enb_ctxt,
"The number of retx=%d exceeded its max=%d\n", "The number of retx=%d exceeded its max=%d\n",
h.nof_retxs + 1, h.nof_retxs + 1,
ue_ctxt.ue_cfg.maxharq_tx); ue_ctxt.ue_cfg.maxharq_tx);
CONDERROR(h.dci_loc.L != pdsch.dci.location.L, "Harq DCI aggregation level changed.\n"); // CONDERROR(h.dci_loc.L != pdsch.dci.location.L, "Harq DCI aggregation level changed.\n");
CONDERROR(h.tbs != pdsch.tbs[0], "TBS changed during HARQ retx\n"); CONDERROR(h.tbs != pdsch.tbs[0], "TBS changed during HARQ retx\n");
} }

Loading…
Cancel
Save