diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c index c0f7c44630..549a2e20df 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -282,6 +282,10 @@ void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t e free_mem_block (tbP); LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:\n", frame, rlcP->module_id, rlcP->rb_id); rlcP->status_requested = 1; +#if defined(RLC_STOP_ON_LOST_PDU) + AssertFatal( 0 == 1, + "[FRAME %05d][RLC_AM][MOD %d][RB %d] LOST PDU DETECTED\n", frame, rlcP->module_id, rlcP->rb_id); +#endif } else { // 5.1.3.2.3 // Actions when a RLC data PDU is placed in the reception buffer @@ -333,6 +337,7 @@ void rlc_am_receive_process_data_pdu (rlc_am_entity_t *rlcP, u32_t frame, u8_t e } rlc_am_rx_list_reassemble_rlc_sdus(rlcP,frame,eNB_flag); } + if (rlcP->t_reordering.running) { if ((rlcP->vr_x == rlcP->vr_r) || ((rlc_am_in_rx_window(rlcP, pdu_info->sn) == 0) && (rlcP->vr_x != rlcP->vr_mr))) { rlc_am_stop_and_reset_timer_reordering(rlcP,frame); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c index 2a25c25aef..f273ecafd6 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -29,13 +29,11 @@ Address : Eurecom, 2229, route des crĂȘtes, 06560 Valbonne Sophia Antipolis #define RLC_AM_MODULE #define RLC_AM_RX_LIST_C //----------------------------------------------------------------------------- -#ifdef USER_MODE -#include -#endif //----------------------------------------------------------------------------- //#include "rtos_header.h" #include "platform_types.h" //----------------------------------------------------------------------------- +#include "assertions.h" #include "list.h" #include "rlc_am.h" #include "LAYER2/MAC/extern.h" @@ -450,6 +448,12 @@ void rlc_am_rx_list_reassemble_rlc_sdus(rlc_am_entity_t* rlcP,u32_t frame, u8_t } rlc_am_rx_pdu_management = ((rlc_am_rx_pdu_management_t*)(cursor->data)); } else { +#if defined(RLC_STOP_ON_LOST_PDU) + if (list2_get_head(&rlcP->receiver_buffer) != cursor) { + AssertFatal( 0 == 1, + "[FRAME %05d][RLC_AM][MOD %d][RB %d] LOST PDU DETECTED\n", frame, rlcP->module_id, rlcP->rb_id); + } +#endif return; } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index 8c906e9393..f29deec983 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -70,20 +70,24 @@ signed int rlc_um_get_pdu_infos(u32_t frame,rlc_um_pdu_sn_10_t* headerP, s16_t t while (li_to_read) { li_length_in_bytes = li_length_in_bytes ^ 3; if (li_length_in_bytes == 2) { + AssertFatal( total_sizeP >= ((uint64_t)(&e_li->b2) - (uint64_t)headerP), + "DECODING PDU TOO FAR PDU size %d", total_sizeP); pdu_infoP->li_list[pdu_infoP->num_li] = ((u16_t)(e_li->b1 << 4)) & 0x07F0; pdu_infoP->li_list[pdu_infoP->num_li] |= (((u8_t)(e_li->b2 >> 4)) & 0x000F); li_to_read = e_li->b1 & 0x80; pdu_infoP->header_size += 2; } else { + AssertFatal( total_sizeP >= ((uint64_t)(&e_li->b3) - (uint64_t)headerP), + "DECODING PDU TOO FAR PDU size %d", total_sizeP); pdu_infoP->li_list[pdu_infoP->num_li] = ((u16_t)(e_li->b2 << 8)) & 0x0700; pdu_infoP->li_list[pdu_infoP->num_li] |= e_li->b3; li_to_read = e_li->b2 & 0x08; e_li++; pdu_infoP->header_size += 1; } + AssertFatal( pdu_infoP->num_li >= RLC_AM_MAX_SDU_IN_PDU, "[FRAME %05d][RLC_UM][MOD XX][RB XX][GET PDU INFO] SN %04d TOO MANY LIs ", frame, pdu_infoP->sn); sum_li += pdu_infoP->li_list[pdu_infoP->num_li]; pdu_infoP->num_li = pdu_infoP->num_li + 1; - AssertFatal( pdu_infoP->num_li > RLC_AM_MAX_SDU_IN_PDU, "[FRAME %05d][RLC_UM][MOD XX][RB XX][GET PDU INFO] SN %04d TOO MANY LIs ", frame, pdu_infoP->sn); if (pdu_infoP->num_li > RLC_AM_MAX_SDU_IN_PDU) { return -2; } @@ -230,9 +234,9 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si rlc_um_reassembly (data, size, rlcP,frame); rlc_um_send_sdu(rlcP,frame,eNB_flag); } else { - //clear sdu already done - rlcP->stat_rx_data_pdu_dropped += 1; - rlcP->stat_rx_data_bytes_dropped += tb_ind->size; + //clear sdu already done + rlcP->stat_rx_data_pdu_dropped += 1; + rlcP->stat_rx_data_bytes_dropped += tb_ind->size; } rlcP->reassembly_missing_sn_detected = 0; break; @@ -246,8 +250,13 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si //LOG_D(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN detected][RLC_UM][MOD %02d][RB %02d]\n", // frame, rlcP->module_id,rlcP->rb_id, rlcP->module_id,rlcP->rb_id); rlcP->reassembly_missing_sn_detected = 1; // not necessary but for readability of the code - rlcP->stat_rx_data_pdu_dropped += 1; - rlcP->stat_rx_data_bytes_dropped += tb_ind->size; + rlcP->stat_rx_data_pdu_dropped += 1; + rlcP->stat_rx_data_bytes_dropped += tb_ind->size; +#if defined(RLC_STOP_ON_LOST_PDU) + AssertFatal( rlcP->reassembly_missing_sn_detected == 1, + "[RLC_UM][MOD %d][RB %d][FRAME %05d] MISSING PDU DETECTED\n", + rlcP->module_id, rlcP->rb_id, frame); +#endif } break; @@ -308,8 +317,8 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si if (rlcP->reassembly_missing_sn_detected) { reassembly_start_index = 1; data = &data[li_array[0]]; - //rlcP->stat_rx_data_pdu_dropped += 1; - rlcP->stat_rx_data_bytes_dropped += li_array[0]; + //rlcP->stat_rx_data_pdu_dropped += 1; + rlcP->stat_rx_data_bytes_dropped += li_array[0]; } else { reassembly_start_index = 0; } @@ -361,13 +370,14 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si default: LOG_W(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN detected][RLC_UM][MOD %02d][RB %02d]\n", frame, rlcP->module_id,rlcP->rb_id, rlcP->module_id,rlcP->rb_id); -#ifdef USER_MODE - assert(1 != 1); -#endif - rlcP->stat_rx_data_pdu_dropped += 1; - rlcP->stat_rx_data_bytes_dropped += tb_ind->size; + rlcP->stat_rx_data_pdu_dropped += 1; + rlcP->stat_rx_data_bytes_dropped += tb_ind->size; rlcP->reassembly_missing_sn_detected = 1; +#if defined(RLC_STOP_ON_LOST_PDU) + AssertFatal( rlcP->reassembly_missing_sn_detected == 1, + "[RLC_UM][MOD %d][RB %d][FRAME %05d] MISSING PDU DETECTED\n", rlcP->module_id, rlcP->rb_id, frame); +#endif } } } @@ -380,6 +390,10 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si frame, rlcP->module_id,rlcP->rb_id, sn, rlcP->module_id,rlcP->rb_id); rlcP->reassembly_missing_sn_detected = 1; rlc_um_clear_rx_sdu(rlcP); +#if defined(RLC_STOP_ON_LOST_PDU) + AssertFatal( rlcP->reassembly_missing_sn_detected == 1, + "[FRAME %05d][RLC_UM][MOD %d][RB %d] MISSING PDU DETECTED\n", frame, rlcP->module_id, rlcP->rb_id); +#endif } sn = (sn + 1) % rlcP->rx_sn_modulo; if ((sn == rlcP->vr_uh) || (sn == end_snP)){