Adding checks on RLC AM segment NACK offsets

This commit is contained in:
Paul Sutton 2017-06-07 08:32:47 +01:00
parent 5e030dc805
commit 0e87bc7b80
1 changed files with 19 additions and 11 deletions

View File

@ -909,22 +909,30 @@ void rlc_am::handle_control_pdu(uint8_t *payload, uint32_t nof_bytes)
if(status.nacks[j].nack_sn == i) { if(status.nacks[j].nack_sn == i) {
nack = true; nack = true;
update_vt_a = false; update_vt_a = false;
if(tx_window.end() != tx_window.find(i)) it = tx_window.find(i);
if(tx_window.end() != it)
{ {
if(!retx_queue_has_sn(i)) { if(!retx_queue_has_sn(i)) {
rlc_amd_retx_t retx; rlc_amd_retx_t retx;
retx.is_segment = status.nacks[j].has_so; retx.so_start = 0;
if(retx.is_segment) { retx.so_end = it->second.buf->N_bytes;
retx.so_start = status.nacks[j].so_start;
if(status.nacks[j].so_end == 0x7FFF) { if(status.nacks[j].has_so) {
retx.so_end = tx_window.find(i)->second.buf->N_bytes; if(status.nacks[j].so_start < it->second.buf->N_bytes &&
}else{ status.nacks[j].so_end <= it->second.buf->N_bytes) {
retx.so_end = status.nacks[j].so_end + 1; retx.is_segment = true;
retx.so_start = status.nacks[j].so_start;
if(status.nacks[j].so_end == 0x7FFF) {
retx.so_end = it->second.buf->N_bytes;
}else{
retx.so_end = status.nacks[j].so_end + 1;
}
} else {
log->warning("%s invalid segment NACK received for SN %d. so_start: %d, so_end: %d, N_bytes: %d\n",
rb_id_text[lcid], i, status.nacks[j].so_start, status.nacks[j].so_end, it->second.buf->N_bytes);
} }
} else {
retx.so_start = 0;
retx.so_end = tx_window.find(i)->second.buf->N_bytes;
} }
retx.sn = i; retx.sn = i;
retx_queue.push_back(retx); retx_queue.push_back(retx);
} }