mirror of https://github.com/PentHertz/srsLTE.git
extended broadcast+RAR DCI encoding scheduler tests
This commit is contained in:
parent
3e07767f28
commit
3a4ae3d69d
|
@ -46,7 +46,7 @@ tbs_info compute_mcs_and_tbs(uint32_t nof_prb,
|
||||||
bool use_tbs_index_alt);
|
bool use_tbs_index_alt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute lowest MCS, TBS based on CQI, N_prb that satisfies TBS >= req_bytes
|
* Compute lowest MCS, TBS based on CQI, N_prb that satisfies TBS >= req_bytes (best effort)
|
||||||
* \remark See TS 36.213 - Table 7.1.7.1-1/1A
|
* \remark See TS 36.213 - Table 7.1.7.1-1/1A
|
||||||
* @return resulting TBS (in bytes) and mcs. TBS=-1 if no valid solution was found.
|
* @return resulting TBS (in bytes) and mcs. TBS=-1 if no valid solution was found.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -188,6 +188,9 @@ int test_sib_scheduling(const sf_output_res_t& sf_out, uint32_t enb_cc_idx)
|
||||||
"Allocated BC process with TBS=%d < sib_len=%d",
|
"Allocated BC process with TBS=%d < sib_len=%d",
|
||||||
bc->tbs,
|
bc->tbs,
|
||||||
cell_params.cfg.sibs[bc->index].len);
|
cell_params.cfg.sibs[bc->index].len);
|
||||||
|
CONDERROR(bc->dci.rnti != 0xffff, "Invalid rnti=0x%x for SIB%d", bc->dci.rnti, bc->index);
|
||||||
|
CONDERROR(bc->dci.format != SRSLTE_DCI_FORMAT1A, "Invalid DCI format for SIB%d", bc->index);
|
||||||
|
|
||||||
uint32_t x = (bc->index - 1) * cell_params.cfg.si_window_ms;
|
uint32_t x = (bc->index - 1) * cell_params.cfg.si_window_ms;
|
||||||
uint32_t sf = x % 10;
|
uint32_t sf = x % 10;
|
||||||
uint32_t sfn_start = sfn;
|
uint32_t sfn_start = sfn;
|
||||||
|
@ -302,6 +305,21 @@ int test_dci_content_common(const sf_output_res_t& sf_out, uint32_t enb_cc_idx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TEST: max coderate is not exceeded for RA and Broadcast
|
||||||
|
srslte_dl_sf_cfg_t dl_sf = {};
|
||||||
|
dl_sf.cfi = sf_out.dl_cc_result[enb_cc_idx].cfi;
|
||||||
|
dl_sf.tti = to_tx_dl(sf_out.tti_rx).to_uint();
|
||||||
|
auto test_ra_bc_coderate = [&dl_sf, &cell_params](uint32_t tbs, const srslte_dci_dl_t& dci) {
|
||||||
|
srslte_pdsch_grant_t grant = {};
|
||||||
|
srslte_ra_dl_grant_to_grant_prb_allocation(&dci, &grant, cell_params.cfg.cell.nof_prb);
|
||||||
|
uint32_t nof_re = srslte_ra_dl_grant_nof_re(&cell_params.cfg.cell, &dl_sf, &grant);
|
||||||
|
float coderate = srslte_coderate(tbs * 8, nof_re);
|
||||||
|
const uint32_t Qm = 2;
|
||||||
|
CONDERROR(coderate > 0.930f * Qm, "Max coderate was exceeded from broadcast DCI");
|
||||||
|
return SRSLTE_SUCCESS;
|
||||||
|
};
|
||||||
|
|
||||||
for (uint32_t i = 0; i < dl_result.nof_bc_elems; ++i) {
|
for (uint32_t i = 0; i < dl_result.nof_bc_elems; ++i) {
|
||||||
auto& bc = dl_result.bc[i];
|
auto& bc = dl_result.bc[i];
|
||||||
if (bc.type == sched_interface::dl_sched_bc_t::BCCH) {
|
if (bc.type == sched_interface::dl_sched_bc_t::BCCH) {
|
||||||
|
@ -314,10 +332,16 @@ int test_dci_content_common(const sf_output_res_t& sf_out, uint32_t enb_cc_idx)
|
||||||
} else {
|
} else {
|
||||||
TESTERROR("Invalid broadcast process id=%d", (int)bc.type);
|
TESTERROR("Invalid broadcast process id=%d", (int)bc.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TESTASSERT(test_ra_bc_coderate(bc.tbs, bc.dci) == SRSLTE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < dl_result.nof_rar_elems; ++i) {
|
for (uint32_t i = 0; i < dl_result.nof_rar_elems; ++i) {
|
||||||
const auto& rar = dl_result.rar[i];
|
const auto& rar = dl_result.rar[i];
|
||||||
CONDERROR(rar.tbs == 0, "Allocated RAR process with invalid TBS=%d", rar.tbs);
|
CONDERROR(rar.tbs == 0, "Allocated RAR process with invalid TBS=%d", rar.tbs);
|
||||||
|
|
||||||
|
// TEST: max coderate is not exceeded
|
||||||
|
TESTASSERT(test_ra_bc_coderate(rar.tbs, rar.dci) == SRSLTE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SRSLTE_SUCCESS;
|
return SRSLTE_SUCCESS;
|
||||||
|
|
|
@ -122,6 +122,38 @@ int test_mcs_tbs_dl_helper(const sched_cell_params_t& cell_params, const tbs_tes
|
||||||
return SRSLTE_SUCCESS;
|
return SRSLTE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int assert_mcs_tbs_result(uint32_t cell_nof_prb,
|
||||||
|
uint32_t cqi,
|
||||||
|
uint32_t prb_grant_size,
|
||||||
|
uint32_t tbs,
|
||||||
|
uint32_t mcs,
|
||||||
|
bool alt_cqi_table = false)
|
||||||
|
{
|
||||||
|
sched_cell_params_t cell_params = {};
|
||||||
|
sched_interface::cell_cfg_t cell_cfg = generate_default_cell_cfg(cell_nof_prb);
|
||||||
|
sched_interface::sched_args_t sched_args = {};
|
||||||
|
cell_params.set_cfg(0, cell_cfg, sched_args);
|
||||||
|
tbs_test_args args;
|
||||||
|
args.verbose = true;
|
||||||
|
args.cqi = cqi;
|
||||||
|
args.prb_grant_size = prb_grant_size;
|
||||||
|
args.use_tbs_index_alt = alt_cqi_table;
|
||||||
|
if (alt_cqi_table) {
|
||||||
|
args.max_mcs = std::min(args.max_mcs, 27u); // limited to 27 for 256-QAM
|
||||||
|
}
|
||||||
|
|
||||||
|
tbs_info expected_result;
|
||||||
|
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
||||||
|
CONDERROR(expected_result != tbs_info(tbs / 8, mcs),
|
||||||
|
"TBS computation failure. {%d, %d}!={%d, %d}",
|
||||||
|
expected_result.tbs_bytes * 8,
|
||||||
|
expected_result.mcs,
|
||||||
|
tbs,
|
||||||
|
mcs);
|
||||||
|
|
||||||
|
return SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int test_mcs_lookup_specific()
|
int test_mcs_lookup_specific()
|
||||||
{
|
{
|
||||||
sched_cell_params_t cell_params = {};
|
sched_cell_params_t cell_params = {};
|
||||||
|
@ -134,50 +166,14 @@ int test_mcs_lookup_specific()
|
||||||
|
|
||||||
/* TEST CASE: DL, no 256-QAM */
|
/* TEST CASE: DL, no 256-QAM */
|
||||||
// cqi=5,Nprb=1 -> {mcs=3, tbs_idx=3, tbs=40}
|
// cqi=5,Nprb=1 -> {mcs=3, tbs_idx=3, tbs=40}
|
||||||
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
TESTASSERT(assert_mcs_tbs_result(6, 5, 1, 40, 3) == SRSLTE_SUCCESS);
|
||||||
CONDERROR(expected_result != tbs_info(40 / 8, 3),
|
|
||||||
"TBS computation failure. {%d, %d}!={40, 3}",
|
|
||||||
expected_result.tbs_bytes * 8,
|
|
||||||
expected_result.mcs);
|
|
||||||
|
|
||||||
// cqi=15,Nprb=1 -> {mcs=19, tbs_idx=17, tbs=336}
|
TESTASSERT(assert_mcs_tbs_result(6, 15, 1, 336, 19) == SRSLTE_SUCCESS);
|
||||||
args.cqi = 15;
|
TESTASSERT(assert_mcs_tbs_result(6, 5, 4, 256, 4) == SRSLTE_SUCCESS);
|
||||||
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
|
||||||
CONDERROR(expected_result != tbs_info(336 / 8, 19),
|
|
||||||
"TBS computation failure. {%d, %d}!={336, 19}",
|
|
||||||
expected_result.tbs_bytes * 8,
|
|
||||||
expected_result.mcs);
|
|
||||||
|
|
||||||
// cqi=9,Nprb=1,cell_nprb=100 -> {mcs=28, tbs_idx=17, tbs=712}
|
TESTASSERT(assert_mcs_tbs_result(100, 9, 1, 712, 28) == SRSLTE_SUCCESS);
|
||||||
cell_params = {};
|
TESTASSERT(assert_mcs_tbs_result(100, 10, 10, 5736, 25) == SRSLTE_SUCCESS);
|
||||||
cell_cfg = generate_default_cell_cfg(100);
|
TESTASSERT(assert_mcs_tbs_result(100, 15, 1, 968, 27, true) == SRSLTE_SUCCESS);
|
||||||
cell_params.set_cfg(0, cell_cfg, sched_args);
|
|
||||||
args.cqi = 9;
|
|
||||||
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
|
||||||
CONDERROR(expected_result != tbs_info(712 / 8, 28),
|
|
||||||
"TBS computation failure. {%d, %d}!={712, 28}",
|
|
||||||
expected_result.tbs_bytes * 8,
|
|
||||||
expected_result.mcs);
|
|
||||||
|
|
||||||
// cqi=10,Nprb=10,cell_nprb=100 -> {mcs=28, tbs=5736}
|
|
||||||
args.prb_grant_size = 10;
|
|
||||||
args.cqi = 10;
|
|
||||||
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
|
||||||
CONDERROR(expected_result != tbs_info(5736 / 8, 25),
|
|
||||||
"TBS computation failure. {%d, %d}!={5736, 25}",
|
|
||||||
expected_result.tbs_bytes * 8,
|
|
||||||
expected_result.mcs);
|
|
||||||
|
|
||||||
// cqi=15,Nprb=1,256-QAM -> {mcs=26,tbs_idx=32,tbs=968}
|
|
||||||
args.prb_grant_size = 1;
|
|
||||||
args.use_tbs_index_alt = true;
|
|
||||||
args.max_mcs = 27; // limited to 27 for 256-QAM
|
|
||||||
args.cqi = 15;
|
|
||||||
TESTASSERT(test_mcs_tbs_dl_helper(cell_params, args, &expected_result) == SRSLTE_SUCCESS);
|
|
||||||
CONDERROR(expected_result != tbs_info(968 / 8, 27),
|
|
||||||
"TBS computation failure. {%d, %d}!={968, 27}",
|
|
||||||
expected_result.tbs_bytes * 8,
|
|
||||||
expected_result.mcs);
|
|
||||||
|
|
||||||
return SRSLTE_SUCCESS;
|
return SRSLTE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -279,6 +275,14 @@ int test_min_mcs_tbs_specific()
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
auto& mac_log = srslog::fetch_basic_logger("MAC");
|
||||||
|
mac_log.set_level(srslog::basic_levels::info);
|
||||||
|
auto& test_log = srslog::fetch_basic_logger("TEST");
|
||||||
|
test_log.set_level(srslog::basic_levels::info);
|
||||||
|
|
||||||
|
// Start the log backend.
|
||||||
|
srslog::init();
|
||||||
|
|
||||||
TESTASSERT(srsenb::test_mcs_lookup_specific() == SRSLTE_SUCCESS);
|
TESTASSERT(srsenb::test_mcs_lookup_specific() == SRSLTE_SUCCESS);
|
||||||
TESTASSERT(srsenb::test_mcs_tbs_consistency_all() == SRSLTE_SUCCESS);
|
TESTASSERT(srsenb::test_mcs_tbs_consistency_all() == SRSLTE_SUCCESS);
|
||||||
TESTASSERT(srsenb::test_min_mcs_tbs_specific() == SRSLTE_SUCCESS);
|
TESTASSERT(srsenb::test_min_mcs_tbs_specific() == SRSLTE_SUCCESS);
|
||||||
|
|
Loading…
Reference in New Issue