mirror of https://github.com/PentHertz/srsLTE.git
Make RLC retransmissions deterministic. It was creating unpredictablity
in the RLC AM tests. See issue #2228
This commit is contained in:
parent
fed4e0ad82
commit
350e90a030
|
@ -126,7 +126,7 @@ private:
|
||||||
|
|
||||||
bool retx_queue_has_sn(uint32_t sn);
|
bool retx_queue_has_sn(uint32_t sn);
|
||||||
int required_buffer_size(rlc_amd_retx_t retx);
|
int required_buffer_size(rlc_amd_retx_t retx);
|
||||||
void retransmit_random_pdu();
|
void retransmit_pdu();
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
bool poll_required();
|
bool poll_required();
|
||||||
|
|
|
@ -409,9 +409,9 @@ int rlc_am_lte::rlc_am_lte_tx::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
goto unlock_and_exit;
|
goto unlock_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Section 5.2.2.3 in TS 36.311, if tx_window is full and retx_queue empty, retransmit random PDU
|
// Section 5.2.2.3 in TS 36.311, if tx_window is full and retx_queue empty, retransmit PDU
|
||||||
if (tx_window.size() >= RLC_AM_WINDOW_SIZE && retx_queue.empty()) {
|
if (tx_window.size() >= RLC_AM_WINDOW_SIZE && retx_queue.empty()) {
|
||||||
retransmit_random_pdu();
|
retransmit_pdu();
|
||||||
}
|
}
|
||||||
|
|
||||||
// RETX if required
|
// RETX if required
|
||||||
|
@ -435,11 +435,11 @@ void rlc_am_lte::rlc_am_lte_tx::timer_expired(uint32_t timeout_id)
|
||||||
pthread_mutex_lock(&mutex);
|
pthread_mutex_lock(&mutex);
|
||||||
if (poll_retx_timer.is_valid() && poll_retx_timer.id() == timeout_id) {
|
if (poll_retx_timer.is_valid() && poll_retx_timer.id() == timeout_id) {
|
||||||
log->debug("%s Poll reTx timer expired after %dms\n", RB_NAME, poll_retx_timer.duration());
|
log->debug("%s Poll reTx timer expired after %dms\n", RB_NAME, poll_retx_timer.duration());
|
||||||
// Section 5.2.2.3 in TS 36.311, schedule random PDU for retransmission if
|
// Section 5.2.2.3 in TS 36.311, schedule PDU for retransmission if
|
||||||
// (a) both tx and retx buffer are empty, or
|
// (a) both tx and retx buffer are empty, or
|
||||||
// (b) no new data PDU can be transmitted (tx window is full)
|
// (b) no new data PDU can be transmitted (tx window is full)
|
||||||
if ((retx_queue.empty() && tx_sdu_queue.size() == 0) || tx_window.size() >= RLC_AM_WINDOW_SIZE) {
|
if ((retx_queue.empty() && tx_sdu_queue.size() == 0) || tx_window.size() >= RLC_AM_WINDOW_SIZE) {
|
||||||
retransmit_random_pdu();
|
retransmit_pdu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&mutex);
|
pthread_mutex_unlock(&mutex);
|
||||||
|
@ -449,12 +449,11 @@ void rlc_am_lte::rlc_am_lte_tx::timer_expired(uint32_t timeout_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rlc_am_lte::rlc_am_lte_tx::retransmit_random_pdu()
|
void rlc_am_lte::rlc_am_lte_tx::retransmit_pdu()
|
||||||
{
|
{
|
||||||
if (not tx_window.empty()) {
|
if (not tx_window.empty()) {
|
||||||
// randomly select PDU in tx window for retransmission
|
// select PDU in tx window for retransmission
|
||||||
std::map<uint32_t, rlc_amd_tx_pdu_t>::iterator it = tx_window.begin();
|
std::map<uint32_t, rlc_amd_tx_pdu_t>::iterator it = tx_window.begin();
|
||||||
std::advance(it, rand() % tx_window.size());
|
|
||||||
log->info("%s Schedule SN=%d for reTx.\n", RB_NAME, it->first);
|
log->info("%s Schedule SN=%d for reTx.\n", RB_NAME, it->first);
|
||||||
rlc_amd_retx_t retx = {};
|
rlc_amd_retx_t retx = {};
|
||||||
retx.is_segment = false;
|
retx.is_segment = false;
|
||||||
|
|
|
@ -394,8 +394,7 @@ bool retx_test()
|
||||||
assert(metrics.rx_buffered_bytes == 3);
|
assert(metrics.rx_buffered_bytes == 3);
|
||||||
|
|
||||||
// Step timers until reordering timeout expires
|
// Step timers until reordering timeout expires
|
||||||
int cnt = 5;
|
for (int cnt = 0; cnt < 5; cnt++) {
|
||||||
while (cnt--) {
|
|
||||||
timers.step_all();
|
timers.step_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue