diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index 463507bd4eff8b07d9671644290cc9e05231bfad..493aa22360ed0e92b98c7a51c4c4a537ea9f83fb 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -48,14 +48,10 @@ #include "UTIL/LOG/log.h" #include "UL-AM-RLC.h" #include "DL-AM-RLC.h" -//#define TRACE_RLC_AM_DATA_REQUEST //#define TRACE_RLC_AM_TX_STATUS //#define TRACE_RLC_AM_TX -//#define TRACE_RLC_AM_RX //#define TRACE_RLC_AM_BO -extern rlc_am_control_pdu_info_t g_rlc_am_control_pdu_info; - //----------------------------------------------------------------------------- uint32_t rlc_am_get_buffer_occupancy_in_bytes ( @@ -514,7 +510,6 @@ rlc_am_get_pdus ( if (rlc_pP->nb_bytes_requested_by_mac <= 2) { LOG_D(RLC, "NUM BYTES REQUESTED BY MAC = %d", rlc_pP->nb_bytes_requested_by_mac); } - LOG_D(RLC, "\n"); } @@ -608,8 +603,52 @@ rlc_am_mac_status_indication ( } } else { + if (rlc_am_is_timer_poll_retransmit_timed_out(ctxt_pP, rlc)) { + if ((status_resp.buffer_occupancy_in_bytes == 0) && (rlc->input_sdus[rlc->current_sdu_index].mem_block == NULL) && (rlc->nb_sdu > 0)) { + // force BO to be > 0 + rlc_sn_t sn = (rlc->vt_s - 1) & RLC_AM_SN_MASK; + rlc_sn_t sn_end = (rlc->vt_a - 1) & RLC_AM_SN_MASK; + int found_pdu = 0; + rlc_sn_t found_pdu_sn = 0; // avoid warning + + + while (sn != sn_end) { + if (rlc->pdu_retrans_buffer[sn].mem_block != NULL) { + if (!found_pdu) { + found_pdu = 1; + found_pdu_sn = sn; + } + status_resp.buffer_occupancy_in_bytes = rlc->pdu_retrans_buffer[sn].header_and_payload_size; + status_resp.buffer_occupancy_in_pdus = rlc->nb_sdu; + status_resp.head_sdu_remaining_size_to_send = status_resp.buffer_occupancy_in_bytes; + // TODO head_sdu_is_segmented + break; + } + } + } + } } - +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_RX_MESSAGE( + (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE, + (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_MAC_ENB:MSC_MAC_UE, + NULL,0, + MSC_AS_TIME_FMT" "PROTOCOL_RLC_AM_MSC_FMT" STATUS-IND %u", + MSC_AS_TIME_ARGS(ctxt_pP), + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, rlc), + tb_sizeP); + MSC_LOG_TX_MESSAGE( + (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE, + (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_MAC_ENB:MSC_MAC_UE, + NULL,0, + MSC_AS_TIME_FMT" "PROTOCOL_RLC_AM_MSC_FMT" STATUS-RESP BO:%u/n%u(%u) %s sdu remain %u", + MSC_AS_TIME_ARGS(ctxt_pP), + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, rlc), + status_resp.buffer_occupancy_in_bytes, + status_resp.buffer_occupancy_in_pdus,rlc->nb_sdu, + (status_resp.head_sdu_is_segmented)?"sdu seg":"sdu not seg", + status_resp.head_sdu_remaining_size_to_send); +#endif #ifdef TRACE_RLC_AM_TX_STATUS @@ -794,7 +833,7 @@ rlc_am_mac_data_request ( # endif } } else { - if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, &tb_size_in_bytes, &g_rlc_am_control_pdu_info) >= 0) { + if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, &tb_size_in_bytes, &l_rlc_p->control_pdu_info) >= 0) { tb_size_in_bytes = ((struct mac_tb_req *) (tb_p->data))->tb_size; //tb_size_in_bytes modified by rlc_am_get_control_pdu_infos! #ifdef MESSAGE_CHART_GENERATOR message_string_size = 0; @@ -802,18 +841,18 @@ rlc_am_mac_data_request ( MSC_AS_TIME_FMT" "PROTOCOL_RLC_AM_MSC_FMT" STATUS ACK_SN %u", MSC_AS_TIME_ARGS(ctxt_pP), PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, l_rlc_p), - g_rlc_am_control_pdu_info.ack_sn); + l_rlc_p->control_pdu_info.ack_sn); - for (num_nack = 0; num_nack < g_rlc_am_control_pdu_info.num_nack; num_nack++) { - if (g_rlc_am_control_pdu_info.nack_list[num_nack].e2) { + for (num_nack = 0; num_nack < l_rlc_p->control_pdu_info.num_nack; num_nack++) { + if (l_rlc_p->control_pdu_info.nack_list[num_nack].e2) { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %u SO START %u SO END %u", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_start, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_end); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_start, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_end); } else { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %u", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn); } } @@ -831,19 +870,19 @@ rlc_am_mac_data_request ( message_string_size += sprintf(&message_string[message_string_size], "PDU size : %u\n", tb_size_in_bytes); message_string_size += sprintf(&message_string[message_string_size], "PDU type : RLC AM DATA REQ: STATUS PDU\n\n"); message_string_size += sprintf(&message_string[message_string_size], "Header :\n"); - message_string_size += sprintf(&message_string[message_string_size], " D/C : %u\n", g_rlc_am_control_pdu_info.d_c); - message_string_size += sprintf(&message_string[message_string_size], " CPT : %u\n", g_rlc_am_control_pdu_info.cpt); - message_string_size += sprintf(&message_string[message_string_size], " ACK_SN : %u\n", g_rlc_am_control_pdu_info.ack_sn); - message_string_size += sprintf(&message_string[message_string_size], " E1 : %u\n", g_rlc_am_control_pdu_info.e1); + message_string_size += sprintf(&message_string[message_string_size], " D/C : %u\n", l_rlc_p->control_pdu_info.d_c); + message_string_size += sprintf(&message_string[message_string_size], " CPT : %u\n", l_rlc_p->control_pdu_info.cpt); + message_string_size += sprintf(&message_string[message_string_size], " ACK_SN : %u\n", l_rlc_p->control_pdu_info.ack_sn); + message_string_size += sprintf(&message_string[message_string_size], " E1 : %u\n", l_rlc_p->control_pdu_info.e1); - for (num_nack = 0; num_nack < g_rlc_am_control_pdu_info.num_nack; num_nack++) { - if (g_rlc_am_control_pdu_info.nack_list[num_nack].e2) { + for (num_nack = 0; num_nack < l_rlc_p->control_pdu_info.num_nack; num_nack++) { + if (l_rlc_p->control_pdu_info.nack_list[num_nack].e2) { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d SO START %05d SO END %05d", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_start, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_end); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_start, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_end); } else { - message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d", g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn); + message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d", l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn); } } @@ -1014,25 +1053,25 @@ rlc_am_mac_data_indication ( # endif } } else { - if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, &tb_size_in_bytes, &g_rlc_am_control_pdu_info) >= 0) { + if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, &tb_size_in_bytes, &l_rlc_p->control_pdu_info) >= 0) { #ifdef MESSAGE_CHART_GENERATOR message_string_size = 0; message_string_size += sprintf(&message_string[message_string_size], MSC_AS_TIME_FMT" "PROTOCOL_RLC_AM_MSC_FMT" STATUS size ACK_SN %u", MSC_AS_TIME_ARGS(ctxt_pP), PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, l_rlc_p), - g_rlc_am_control_pdu_info.ack_sn); + l_rlc_p->control_pdu_info.ack_sn); - for (num_nack = 0; num_nack < g_rlc_am_control_pdu_info.num_nack; num_nack++) { - if (g_rlc_am_control_pdu_info.nack_list[num_nack].e2) { + for (num_nack = 0; num_nack < l_rlc_p->control_pdu_info.num_nack; num_nack++) { + if (l_rlc_p->control_pdu_info.nack_list[num_nack].e2) { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %u SO START %u SO END %u", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_start, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_end); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_start, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_end); } else { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %u", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn); } } @@ -1051,19 +1090,19 @@ rlc_am_mac_data_indication ( message_string_size += sprintf(&message_string[message_string_size], "PDU size : %u\n", ((struct mac_tb_ind *) (tb_p->data))->size); message_string_size += sprintf(&message_string[message_string_size], "PDU type : RLC AM DATA IND: STATUS PDU\n\n"); message_string_size += sprintf(&message_string[message_string_size], "Header :\n"); - message_string_size += sprintf(&message_string[message_string_size], " D/C : %u\n", g_rlc_am_control_pdu_info.d_c); - message_string_size += sprintf(&message_string[message_string_size], " CPT : %u\n", g_rlc_am_control_pdu_info.cpt); - message_string_size += sprintf(&message_string[message_string_size], " ACK_SN : %u\n", g_rlc_am_control_pdu_info.ack_sn); - message_string_size += sprintf(&message_string[message_string_size], " E1 : %u\n", g_rlc_am_control_pdu_info.e1); + message_string_size += sprintf(&message_string[message_string_size], " D/C : %u\n", l_rlc_p->control_pdu_info.d_c); + message_string_size += sprintf(&message_string[message_string_size], " CPT : %u\n", l_rlc_p->control_pdu_info.cpt); + message_string_size += sprintf(&message_string[message_string_size], " ACK_SN : %u\n", l_rlc_p->control_pdu_info.ack_sn); + message_string_size += sprintf(&message_string[message_string_size], " E1 : %u\n", l_rlc_p->control_pdu_info.e1); - for (num_nack = 0; num_nack < g_rlc_am_control_pdu_info.num_nack; num_nack++) { - if (g_rlc_am_control_pdu_info.nack_list[num_nack].e2) { + for (num_nack = 0; num_nack < l_rlc_p->control_pdu_info.num_nack; num_nack++) { + if (l_rlc_p->control_pdu_info.nack_list[num_nack].e2) { message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d SO START %05d SO END %05d", - g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_start, - g_rlc_am_control_pdu_info.nack_list[num_nack].so_end); + l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_start, + l_rlc_p->control_pdu_info.nack_list[num_nack].so_end); } else { - message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d", g_rlc_am_control_pdu_info.nack_list[num_nack].nack_sn); + message_string_size += sprintf(&message_string[message_string_size], " NACK SN %04d", l_rlc_p->control_pdu_info.nack_list[num_nack].nack_sn); } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h index ff8b7a0da1d513a247e8f902af320fe26e58de20..ea661b3881e3af954f8de1524534cc0926d03092 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -62,12 +62,13 @@ typedef struct rlc_am_entity_s { rb_id_t rb_id; /*!< \brief Radio bearer identifier, for statistics and trace purpose. */ logical_chan_id_t channel_id; /*!< \brief Transport channel identifier. */ boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ - //boolean_t is_enb; /*!< \brief To know if the RLC belongs to a eNB or UE. */ rlc_buffer_occupancy_t sdu_buffer_occupancy; /*!< \brief Number of bytes of unsegmented SDUs. */ rlc_buffer_occupancy_t retransmission_buffer_occupancy; /*!< \brief Number of bytes of PDUs in retransmission buffer waiting for a ACK. */ rlc_buffer_occupancy_t status_buffer_occupancy; /*!< \brief Number of bytes of control PDUs waiting for transmission. */ + rlc_am_control_pdu_info_t control_pdu_info; + //--------------------------------------------------------------------- // TX BUFFERS //--------------------------------------------------------------------- @@ -86,6 +87,7 @@ typedef struct rlc_am_entity_s { signed int retrans_num_bytes_to_retransmit; /*!< \brief Number of bytes in the retransmission buffer to be retransmitted. */ unsigned int num_nack_so; /*!< \brief Number of segment offsets asked to be retransmitted by peer RLC entity. */ unsigned int num_nack_sn; /*!< \brief Number of segment asked to be retransmitted by peer RLC entity. */ + boolean_t force_poll; /*!< \brief force poll due to t_poll_retransmit time-out. */ //--------------------------------------------------------------------- // RX BUFFERS diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index c38a71cde400ef53108b7946cbb6032f36f136c0..6cc56beaf86969da87aa55ae9f9735c166e86318 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -35,10 +35,7 @@ #include "rlc.h" #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" -//#define TRACE_RLC_AM_RESEGMENT -//#define TRACE_RLC_AM_FORCE_TRAFFIC -//#define TRACE_RLC_AM_NACK -//#define TRACE_RLC_AM_ACK +#include "msc.h" //----------------------------------------------------------------------------- void rlc_am_nack_pdu ( const protocol_ctxt_t* const ctxt_pP, @@ -122,7 +119,14 @@ void rlc_am_nack_pdu ( #endif rlc_pP->stat_tx_pdcp_sdu_discarded += 1; rlc_pP->stat_tx_pdcp_bytes_discarded += rlc_pP->input_sdus[sdu_index].sdu_size; + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" Dropped SDU mui %u cause max_retx %u reached",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), + rlc_pP->input_sdus[sdu_index].mui, + rlc_pP->max_retx_threshold); + rlc_am_free_in_sdu(ctxt_pP, rlc_pP, sdu_index); + } } } @@ -843,6 +847,11 @@ void rlc_am_retransmit_any_pdu( LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[FORCE-TRAFFIC] RE-SEND DATA PDU SN %04d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), sn); +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" RTX any pdu found SN %u",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), sn); +#endif rlc_am_nack_pdu (ctxt_pP, rlc_pP, sn, 0, 0x7FFF); // no need for update rlc_pP->nb_bytes_requested_by_mac pdu_p = rlc_am_retransmit_get_copy(ctxt_pP, rlc_pP, sn); @@ -873,6 +882,11 @@ void rlc_am_retransmit_any_pdu( found_pdu_sn); if (rlc_pP->nb_bytes_requested_by_mac > 4) { +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" RTX any pdu found SN %u (subseg)",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), found_pdu_sn); +#endif rlc_am_nack_pdu (ctxt_pP, rlc_pP, found_pdu_sn, 0, 0x7FFF); pdu_p = rlc_am_retransmit_get_subsegment(ctxt_pP, rlc_pP, found_pdu_sn, &rlc_pP->nb_bytes_requested_by_mac); pdu_sn_10_p = (rlc_am_pdu_sn_10_t*) (&pdu_p->data[sizeof(struct mac_tb_req)]); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c index 4efc4f2742caecde6cd65730e4d6afd3679ff940..0b2b847ec78c7c2e90e33a6bef7f4a07288e6413 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -84,26 +84,25 @@ void rlc_am_pdu_polling ( (rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu) || (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte) || ((rlc_pP->sdu_buffer_occupancy == 0) && (rlc_pP->retrans_num_bytes_to_retransmit == 0)) || - (rlc_pP->vt_s == rlc_pP->vt_ms) + (rlc_pP->vt_s == rlc_pP->vt_ms) || + (rlc_pP->force_poll == TRUE) ) { + rlc_pP->force_poll = FALSE; if (rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX NUM PDU THRESHOLD %d HAS BEEN REACHED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->poll_pdu); - } - + } else if (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX NUM BYTES THRESHOLD %d HAS BEEN REACHED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->poll_byte); - } - + } else if ((rlc_pP->sdu_buffer_occupancy == 0) && (rlc_pP->retrans_num_bytes_to_retransmit == 0)) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX BUFFERS ARE EMPTY\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - } - + } else if (rlc_pP->vt_s == rlc_pP->vt_ms) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE OF WINDOW STALLING\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c index 676a5403d91e22c6d21b081ff35e5efdcd71d59e..fc6b4c3655748e7f3a774c810015d32b13434082 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -44,9 +44,6 @@ //#define TRACE_RLC_AM_STATUS_CREATION 1 -rlc_am_control_pdu_info_t g_rlc_am_control_pdu_info; - - # if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- void @@ -288,7 +285,7 @@ rlc_am_receive_process_control_pdu( rlc_am_pdu_sn_10_t *rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)*first_byte_ppP; sdu_size_t initial_pdu_size = *tb_size_in_bytes_pP; - if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, tb_size_in_bytes_pP, &g_rlc_am_control_pdu_info) >= 0) { + if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, tb_size_in_bytes_pP, &rlc_pP->control_pdu_info) >= 0) { rlc_am_tx_buffer_display(ctxt_pP, rlc_pP, " TX BUFFER BEFORE PROCESS OF STATUS PDU"); LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RX CONTROL PDU VT(A) %04d VT(S) %04d POLL_SN %04d ACK_SN %04d\n", @@ -296,10 +293,10 @@ rlc_am_receive_process_control_pdu( rlc_pP->vt_a, rlc_pP->vt_s, rlc_pP->poll_sn, - g_rlc_am_control_pdu_info.ack_sn); - rlc_am_display_control_pdu_infos(&g_rlc_am_control_pdu_info); + rlc_pP->control_pdu_info.ack_sn); + rlc_am_display_control_pdu_infos(&rlc_pP->control_pdu_info); - rlc_sn_t ack_sn = g_rlc_am_control_pdu_info.ack_sn; + rlc_sn_t ack_sn = rlc_pP->control_pdu_info.ack_sn; rlc_sn_t sn_cursor = rlc_pP->vt_a; rlc_sn_t nack_sn; unsigned int nack_index; @@ -325,13 +322,13 @@ rlc_am_receive_process_control_pdu( // - if t-PollRetransmit is running: // - stop and reset t-PollRetransmit. assert(ack_sn < RLC_AM_SN_MODULO); - assert(g_rlc_am_control_pdu_info.num_nack < RLC_AM_MAX_NACK_IN_STATUS_PDU); + assert(rlc_pP->control_pdu_info.num_nack < RLC_AM_MAX_NACK_IN_STATUS_PDU); if (rlc_am_in_tx_window(ctxt_pP, rlc_pP, ack_sn) > 0) { rlc_pP->num_nack_so = 0; rlc_pP->num_nack_sn = 0; - if (g_rlc_am_control_pdu_info.num_nack == 0) { + if (rlc_pP->control_pdu_info.num_nack == 0) { while (sn_cursor != ack_sn) { if (sn_cursor == rlc_pP->poll_sn) { rlc_am_stop_and_reset_timer_poll_retransmit(ctxt_pP, rlc_pP); @@ -342,7 +339,7 @@ rlc_am_receive_process_control_pdu( } } else { nack_index = 0; - nack_sn = g_rlc_am_control_pdu_info.nack_list[nack_index].nack_sn; + nack_sn = rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn; while (sn_cursor != ack_sn) { if (sn_cursor == rlc_pP->poll_sn) { @@ -357,20 +354,20 @@ rlc_am_receive_process_control_pdu( rlc_am_nack_pdu (ctxt_pP, rlc_pP, sn_cursor, - g_rlc_am_control_pdu_info.nack_list[nack_index].so_start, - g_rlc_am_control_pdu_info.nack_list[nack_index].so_end); + rlc_pP->control_pdu_info.nack_list[nack_index].so_start, + rlc_pP->control_pdu_info.nack_list[nack_index].so_end); nack_index = nack_index + 1; - if (nack_index == g_rlc_am_control_pdu_info.num_nack) { + if (nack_index == rlc_pP->control_pdu_info.num_nack) { nack_sn = 0xFFFF; // value never reached by sn } else { - nack_sn = g_rlc_am_control_pdu_info.nack_list[nack_index].nack_sn; + nack_sn = rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn; } } - if ((nack_index < g_rlc_am_control_pdu_info.num_nack) && (nack_index > 0)) { - if (g_rlc_am_control_pdu_info.nack_list[nack_index].nack_sn != g_rlc_am_control_pdu_info.nack_list[nack_index-1].nack_sn) { + if ((nack_index < rlc_pP->control_pdu_info.num_nack) && (nack_index > 0)) { + if (rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn != rlc_pP->control_pdu_info.nack_list[nack_index-1].nack_sn) { sn_cursor = (sn_cursor + 1) & RLC_AM_SN_MASK; } } else { diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c index 66b1a67abf634f30178e58d0fd8f997989afa39f..7352bae05f15692ecf2cede4f8cfd4377f93fbb3 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -36,6 +36,7 @@ #include "rlc_am.h" #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" +#include "msc.h" //----------------------------------------------------------------------------- void rlc_am_check_timer_poll_retransmit( @@ -76,10 +77,16 @@ rlc_am_check_timer_poll_retransmit( rlc_pP->t_poll_retransmit.running = 0; rlc_pP->t_poll_retransmit.timed_out = 1; rlc_pP->stat_timer_poll_retransmit_timed_out += 1; - +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_poll_retransmit timed-out",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] TIME-OUT\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + + rlc_pP->force_poll= TRUE; //#warning TO DO rlc_am_check_timer_poll_retransmit rlc_pP->t_poll_retransmit.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_poll_retransmit.ms_duration; } @@ -109,6 +116,11 @@ rlc_am_stop_and_reset_timer_poll_retransmit( rlc_pP->t_poll_retransmit.ms_time_out = 0; rlc_pP->t_poll_retransmit.ms_start = 0; rlc_pP->t_poll_retransmit.timed_out = 0; +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_poll_retransmit stopped & reseted",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif } //----------------------------------------------------------------------------- void @@ -120,16 +132,30 @@ rlc_am_start_timer_poll_retransmit( { rlc_pP->t_poll_retransmit.timed_out = 0; - if (rlc_pP->t_poll_retransmit.ms_duration > 0) { - rlc_pP->t_poll_retransmit.running = 1; - rlc_pP->t_poll_retransmit.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_poll_retransmit.ms_duration; - rlc_pP->t_poll_retransmit.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] STARTED (TIME-OUT = FRAME %05d)\n", + if (rlc_pP->t_poll_retransmit.running == 0) { + if (rlc_pP->t_poll_retransmit.ms_duration > 0) { + rlc_pP->t_poll_retransmit.running = 1; + rlc_pP->t_poll_retransmit.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_poll_retransmit.ms_duration; + rlc_pP->t_poll_retransmit.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] STARTED (TIME-OUT = FRAME %05d)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_poll_retransmit.ms_time_out); - } else { +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_poll_retransmit started (TO %u ms)",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_poll_retransmit.ms_time_out); +#endif + } else { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + } + } else { +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_poll_retransmit not restarted (TO %u ms)",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_poll_retransmit.ms_time_out); +#endif + } } //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c index 8054f2c42fb6684ab48fde04f26701c39be35465..31d41ecd88236fa7efa7aece1b67f5a70088380d 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c @@ -36,6 +36,7 @@ #include "rlc_am.h" # include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" +#include "msc.h" //----------------------------------------------------------------------------- void rlc_am_check_timer_reordering( @@ -72,6 +73,11 @@ rlc_am_check_timer_reordering( // - start t-Reordering; // - set VR(X) to VR(H). +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_reordering timed out",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif rlc_pP->t_reordering.running = 0; rlc_pP->t_reordering.timed_out = 1; @@ -128,6 +134,11 @@ rlc_am_stop_and_reset_timer_reordering( rlc_pP->t_reordering.ms_time_out = 0; rlc_pP->t_reordering.ms_start = 0; rlc_pP->t_reordering.timed_out = 0; +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_reordering stopped & reseted",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif } //----------------------------------------------------------------------------- void @@ -138,16 +149,23 @@ rlc_am_start_timer_reordering( { rlc_pP->t_reordering.timed_out = 0; - if (rlc_pP->t_reordering.ms_duration > 0) { - rlc_pP->t_reordering.running = 1; - rlc_pP->t_reordering.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_reordering.ms_duration; - rlc_pP->t_reordering.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] STARTED (TIME-OUT = FRAME %5u)\n", + if (rlc_pP->t_reordering.running == 0){ + if (rlc_pP->t_reordering.ms_duration > 0) { + rlc_pP->t_reordering.running = 1; + rlc_pP->t_reordering.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_reordering.ms_duration; + rlc_pP->t_reordering.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] STARTED (TIME-OUT = %5u ms)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_reordering.ms_time_out); - } else { +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_reordering started (TO %u ms)",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_reordering.ms_time_out); +#endif + } else { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + } } } //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c index bef2043a7586c98e07a372efa97260d0975f3c7d..f874f1656b4767059384c0bbb98b048cbc33832c 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c @@ -36,6 +36,7 @@ #include "rlc_am.h" #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" +#include "msc.h" //----------------------------------------------------------------------------- void rlc_am_check_timer_status_prohibit( @@ -69,6 +70,11 @@ rlc_am_check_timer_status_prohibit( rlc_pP->t_status_prohibit.timed_out = 1; rlc_pP->stat_timer_status_prohibit_timed_out += 1; +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_status_prohibit timed out",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-STATUS-PROHIBIT] TIME-OUT\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); //#warning TO DO rlc_am_check_timer_status_prohibit @@ -93,6 +99,11 @@ rlc_am_stop_and_reset_timer_status_prohibit( rlc_pP->t_status_prohibit.ms_time_out = 0; rlc_pP->t_status_prohibit.ms_start = 0; rlc_pP->t_status_prohibit.timed_out = 0; +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_status_prohibit stopped & reseted",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); +#endif } } //----------------------------------------------------------------------------- @@ -105,17 +116,24 @@ rlc_am_start_timer_status_prohibit( { rlc_pP->t_status_prohibit.timed_out = 0; - if (rlc_pP->t_status_prohibit.ms_duration > 0) { - rlc_pP->t_status_prohibit.running = 1; - rlc_pP->t_status_prohibit.ms_time_out = rlc_pP->t_status_prohibit.ms_duration + PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); - rlc_pP->t_status_prohibit.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-STATUS-PROHIBIT] STARTED (TIME-OUT = TIME %u)\n", + if (rlc_pP->t_status_prohibit.running == 0){ + if (rlc_pP->t_status_prohibit.ms_duration > 0) { + rlc_pP->t_status_prohibit.running = 1; + rlc_pP->t_status_prohibit.ms_time_out = rlc_pP->t_status_prohibit.ms_duration + PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); + rlc_pP->t_status_prohibit.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-STATUS-PROHIBIT] STARTED (TIME-OUT = %u ms)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_status_prohibit.ms_time_out); - LOG_D(RLC, "TIME-OUT = FRAME %u\n", rlc_pP->t_status_prohibit.ms_time_out); - } else { + LOG_D(RLC, "TIME-OUT = FRAME %u\n", rlc_pP->t_status_prohibit.ms_time_out); +#if defined(MESSAGE_CHART_GENERATOR_RLC_MAC) + MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ + "0 "PROTOCOL_RLC_AM_MSC_FMT" t_status_prohibit started (TO %u ms)",\ + PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_status_prohibit.ms_time_out); +#endif + } else { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-STATUS-PROHIBIT] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + } } } //-----------------------------------------------------------------------------