lib,rlc: added unit test that triggers assert when RX window is full

This commit is contained in:
Pedro Alvarez 2022-07-01 17:41:57 +01:00
parent a1db7fe9fe
commit 51ffd91f16
1 changed files with 58 additions and 0 deletions

View File

@ -3121,6 +3121,63 @@ int out_of_order_status(rlc_am_nr_sn_size_t sn_size)
return SRSRAN_SUCCESS;
}
int full_rx_window_t_reassembly_expiry(rlc_am_nr_sn_size_t sn_size)
{
rlc_am_tester tester;
timer_handler timers(8);
byte_buffer_t pdu_bufs[NBUFS];
auto& test_logger = srslog::fetch_basic_logger("TESTER ");
test_delimit_logger delimiter("Full RX window and t-Reassmbly expiry test ({} bit SN)", to_number(sn_size));
rlc_am rlc1(srsran_rat_t::nr, srslog::fetch_basic_logger("RLC_AM_1"), 1, &tester, &tester, &timers);
rlc_am rlc2(srsran_rat_t::nr, srslog::fetch_basic_logger("RLC_AM_1"), 1, &tester, &tester, &timers);
rlc_am_nr_tx* tx1 = dynamic_cast<rlc_am_nr_tx*>(rlc1.get_tx());
rlc_am_nr_rx* rx1 = dynamic_cast<rlc_am_nr_rx*>(rlc1.get_rx());
rlc_am_nr_tx* tx2 = dynamic_cast<rlc_am_nr_tx*>(rlc2.get_tx());
rlc_am_nr_rx* rx2 = dynamic_cast<rlc_am_nr_rx*>(rlc2.get_rx());
auto cfg = rlc_config_t::default_rlc_am_nr_config(to_number(sn_size));
if (not rlc1.configure(cfg)) {
return -1;
}
if (not rlc2.configure(cfg)) {
return -1;
}
uint32_t mod_nr = cardinality(cfg.am_nr.tx_sn_field_length);
// Fill up the RX window
uint32_t sn;
for (uint32_t sn = 0; sn < am_window_size(sn_size) + 1; ++sn) {
unique_byte_buffer_t pdu_buf = srsran::make_byte_buffer();
// Manually prepare header
rlc_am_nr_pdu_header_t hdr = {};
hdr.dc = RLC_DC_FIELD_DATA_PDU;
hdr.p = 0;
hdr.si = rlc_nr_si_field_t::full_sdu;
hdr.sn_size = cfg.am_nr.tx_sn_field_length;
hdr.sn = sn % mod_nr;
// Write header
pdu_buf->N_bytes = rlc_am_nr_write_data_pdu_header(hdr, pdu_buf.get());
// Set payload
pdu_buf->msg[pdu_buf->N_bytes] = sn;
pdu_buf->N_bytes++;
// Write PDUs into RLC 2
if (sn != 0) {
rlc2.write_pdu(pdu_buf->msg, pdu_buf->N_bytes);
}
}
// Step timers until reassambly timeout expires
for (int cnt = 0; cnt < 35; cnt++) {
timers.step_all();
}
return SRSRAN_SUCCESS;
}
int main()
{
// Setup the log message spy to intercept error and warning log entries from RLC
@ -3172,5 +3229,6 @@ int main()
TESTASSERT(rx_nack_range_with_so_ending_with_full_sdu_test(sn_size) == SRSRAN_SUCCESS);
TESTASSERT(out_of_order_status(sn_size) == SRSRAN_SUCCESS);
}
TESTASSERT(full_rx_window_t_reassembly_expiry(rlc_am_nr_sn_size_t::size12bits) == SRSRAN_SUCCESS);
return SRSRAN_SUCCESS;
}