fix RLC UM reestablishment

This commit is contained in:
Andre Puschmann 2019-03-01 11:01:58 +01:00
parent c49dddc09a
commit e84d26ae4e
2 changed files with 30 additions and 10 deletions

View File

@ -156,6 +156,8 @@ private:
void timer_expired(uint32_t timeout_id);
private:
void reset();
byte_buffer_pool *pool;
srslte::log *log;
mac_interface_timers *mac_timers;

View File

@ -550,8 +550,18 @@ void rlc_um::rlc_um_rx::init(srslte::log *log_, uint32_t lcid_, srsue::pdcp_inte
void rlc_um::rlc_um_rx::reestablish()
{
stop();
// try to reassemble any SDUs if possible
if (reordering_timer != NULL) {
if (reordering_timer->is_running()) {
reordering_timer->stop();
timer_expired(reordering_timer_id);
}
}
pthread_mutex_lock(&mutex);
reset();
rx_enabled = true;
pthread_mutex_unlock(&mutex);
}
@ -559,30 +569,36 @@ void rlc_um::rlc_um_rx::stop()
{
pthread_mutex_lock(&mutex);
reset();
if (mac_timers != NULL && reordering_timer != NULL) {
reordering_timer->stop();
mac_timers->timer_release_id(reordering_timer_id);
reordering_timer = NULL;
}
pthread_mutex_unlock(&mutex);
}
void rlc_um::rlc_um_rx::reset()
{
vr_ur = 0;
vr_ux = 0;
vr_uh = 0;
pdu_lost = false;
rx_enabled = false;
if(rx_sdu) {
if (rx_sdu) {
pool->deallocate(rx_sdu);
rx_sdu = NULL;
}
if (mac_timers != NULL && reordering_timer != NULL) {
reordering_timer->stop();
mac_timers->timer_release_id(reordering_timer_id);
reordering_timer = NULL;
}
// Drop all messages in RX window
std::map<uint32_t, rlc_umd_pdu_t>::iterator it;
for(it = rx_window.begin(); it != rx_window.end(); it++) {
pool->deallocate(it->second.buf);
}
rx_window.clear();
pthread_mutex_unlock(&mutex);
}
@ -949,7 +965,9 @@ void rlc_um::rlc_um_rx::timer_expired(uint32_t timeout_id)
log->warning("Lost PDU SN: %d\n", vr_ur);
pdu_lost = true;
rx_sdu->reset();
if (rx_sdu != NULL) {
rx_sdu->reset();
}
while(RX_MOD_BASE(vr_ur) < RX_MOD_BASE(vr_ux)) {
vr_ur = (vr_ur + 1)%cfg.rx_mod;