Commit b5ab7267 authored by gabrielC's avatar gabrielC

RLC AM fix for PDU insertion in case of gaps

parent fd5932c5
...@@ -323,8 +323,9 @@ rlc_am_receive_process_data_pdu ( ...@@ -323,8 +323,9 @@ rlc_am_receive_process_data_pdu (
if (RLC_AM_SN_IN_WINDOW(pdu_info_p->sn, rlc_pP->vr_r)) { if (RLC_AM_SN_IN_WINDOW(pdu_info_p->sn, rlc_pP->vr_r)) {
LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n", LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%04d] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n",
PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),
pdu_info_p->sn,
rlc_pP->vr_r, rlc_pP->vr_r,
rlc_pP->vr_h, rlc_pP->vr_h,
rlc_pP->vr_mr, rlc_pP->vr_mr,
...@@ -433,12 +434,15 @@ rlc_am_receive_process_data_pdu ( ...@@ -433,12 +434,15 @@ rlc_am_receive_process_data_pdu (
} }
} }
LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d\n", LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%04d] NEW VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d VR(X) %04d reassemble=%d\n",
PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),
pdu_info_p->sn,
rlc_pP->vr_r, rlc_pP->vr_r,
rlc_pP->vr_h, rlc_pP->vr_h,
rlc_pP->vr_ms, rlc_pP->vr_ms,
rlc_pP->vr_mr); rlc_pP->vr_mr,
rlc_pP->vr_x,
reassemble);
} else { } else {
rlc_pP->stat_rx_data_pdu_out_of_window += 1; rlc_pP->stat_rx_data_pdu_out_of_window += 1;
rlc_pP->stat_rx_data_bytes_out_of_window += tb_size_in_bytesP; rlc_pP->stat_rx_data_bytes_out_of_window += tb_size_in_bytesP;
......
...@@ -505,7 +505,20 @@ rlc_am_rx_pdu_status_t rlc_am_rx_list_handle_pdu( ...@@ -505,7 +505,20 @@ rlc_am_rx_pdu_status_t rlc_am_rx_list_handle_pdu(
// First case : cursor_p is NULL, it means the SN is received for the first time // First case : cursor_p is NULL, it means the SN is received for the first time
// Insert PDU after previous_cursor_p // Insert PDU after previous_cursor_p
if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn)) { if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn)) {
list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); rlc_usn_t sn_prev = ((rlc_am_rx_pdu_management_t*)(previous_cursor_p->data))->pdu_info.sn;
if (RLC_AM_DIFF_SN(sn_prev,rlc_pP->vr_r) < RLC_AM_DIFF_SN(pdu_rx_info_p->sn,rlc_pP->vr_r)) {
LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%d] PDU INSERTED AFTER PDU SN=%d\n",
PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn,
((rlc_am_rx_pdu_management_t*)(previous_cursor_p->data))->pdu_info.sn);
list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer);
}
else { /* SN of head of Rx PDU list is higher than received PDU SN */
LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%d] PDU INSERTED BEFORE PDU SN=%d\n",
PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn,
pdu_info_cursor_p->sn);
list2_insert_before_element(tb_pP, cursor_p, &rlc_pP->receiver_buffer);
}
return pdu_status; return pdu_status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment