diff --git a/lib/test/upper/rlc_am_test.cc b/lib/test/upper/rlc_am_test.cc index b2d68d3fa..c80d85f9e 100644 --- a/lib/test/upper/rlc_am_test.cc +++ b/lib/test/upper/rlc_am_test.cc @@ -27,11 +27,13 @@ #include #include "srslte/common/log_filter.h" #include "srslte/common/logger_stdout.h" +#include "srslte/common/threads.h" #include "srslte/upper/rlc_am.h" #include "srslte/common/rlc_pcap.h" #include #define NBUFS 5 #define HAVE_PCAP 0 +#define SDU_SIZE 500 using namespace srsue; using namespace srslte; @@ -91,6 +93,48 @@ public: rlc_pcap *pcap; }; +class ul_writer : public thread +{ +public: + ul_writer(rlc_am* rlc_) : rlc(rlc_), running(false) {} + ~ul_writer() { stop(); } + void stop() + { + running = false; + int cnt=0; + while(running && cnt<100) { + usleep(10000); + cnt++; + } + wait_thread_finish(); + } + +private: + void run_thread() { + int sn = 0; + running = true; + while(running) { + byte_buffer_t *pdu = byte_buffer_pool::get_instance()->allocate("rlc_tester::run_thread", true); + if (!pdu) { + printf("Error: Could not allocate PDU in rlc_tester::run_thread\n\n\n"); + // backoff for a bit + usleep(1000); + continue; + } + for (uint32_t i = 0; i < SDU_SIZE; i++) { + pdu->msg[i] = sn; + } + sn++; + pdu->N_bytes = SDU_SIZE; + rlc->write_sdu(pdu); + } + running = false; + } + + rlc_am* rlc; + bool running; +}; + void basic_test() { srslte::log_filter log1("RLC_AM_1"); @@ -1432,6 +1476,42 @@ void reset_test() assert(0 == rlc1.get_buffer_state()); } +void stop_test() +{ + srslte::log_filter log1("RLC_AM_1"); + log1.set_level(srslte::LOG_LEVEL_DEBUG); + log1.set_hex_limit(-1); + rlc_am_tester tester; + mac_dummy_timers timers; + + rlc_am rlc1; + + log1.set_level(srslte::LOG_LEVEL_DEBUG); + + rlc1.init(&log1, 1, &tester, &tester, &timers); + + LIBLTE_RRC_RLC_CONFIG_STRUCT cnfg; + cnfg.rlc_mode = LIBLTE_RRC_RLC_MODE_AM; + cnfg.dl_am_rlc.t_reordering = LIBLTE_RRC_T_REORDERING_MS5; + cnfg.dl_am_rlc.t_status_prohibit = LIBLTE_RRC_T_STATUS_PROHIBIT_MS5; + cnfg.ul_am_rlc.max_retx_thresh = LIBLTE_RRC_MAX_RETX_THRESHOLD_T4; + cnfg.ul_am_rlc.poll_byte = LIBLTE_RRC_POLL_BYTE_KB25; + cnfg.ul_am_rlc.poll_pdu = LIBLTE_RRC_POLL_PDU_P4; + cnfg.ul_am_rlc.t_poll_retx = LIBLTE_RRC_T_POLL_RETRANSMIT_MS5; + + rlc1.configure(&cnfg); + + // start thread reading + ul_writer writer(&rlc1); + writer.start(-2); + + // let writer thread block on tx_queue + usleep(1e6); + + // stop RLC1 + rlc1.stop(); +} + int main(int argc, char **argv) { basic_test(); byte_buffer_pool::get_instance()->cleanup(); @@ -1471,4 +1551,7 @@ int main(int argc, char **argv) { reset_test(); byte_buffer_pool::get_instance()->cleanup(); + + stop_test(); + byte_buffer_pool::get_instance()->cleanup(); }