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 998d71358ec89ade4e326fd643687af42e7d4d0a..613be85a5c278b328e0f7e72f0f257cc2304e199 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -116,13 +116,13 @@ void config_req_rlc_am ( { //----------------------------------------------------------------------------- rlc_union_t *rlc_union_p = NULL; - rlc_am_entity_t *rlc_p = NULL; + rlc_am_entity_t *l_rlc_p = NULL; hash_key_t key = RLC_COLL_KEY_VALUE(enb_module_idP, ue_module_idP, eNB_flagP, rb_idP, srb_flagP); hashtable_rc_t h_rc; h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); if (h_rc == HASH_TABLE_OK) { - rlc_p = &rlc_union_p->rlc.am; + l_rlc_p = &rlc_union_p->rlc.am; LOG_D(RLC, "[FRAME %5u][%s][RRC][MOD %u/%u][][--- CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d) --->][RLC_AM][MOD %u/%u][RB %u]\n", frameP, @@ -138,9 +138,9 @@ void config_req_rlc_am ( enb_module_idP, ue_module_idP, rb_idP); - rlc_am_init(rlc_p,frameP); - rlc_am_set_debug_infos(rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, srb_flagP); - rlc_am_configure(rlc_p,frameP, + rlc_am_init(l_rlc_p,frameP); + rlc_am_set_debug_infos(l_rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, srb_flagP); + rlc_am_configure(l_rlc_p,frameP, config_am_pP->max_retx_threshold, config_am_pP->poll_pdu, config_am_pP->poll_byte, @@ -177,13 +177,13 @@ void config_req_rlc_am_asn1 ( { //----------------------------------------------------------------------------- rlc_union_t *rlc_union_p = NULL; - rlc_am_entity_t *rlc_p = NULL; + rlc_am_entity_t *l_rlc_p = NULL; hash_key_t key = RLC_COLL_KEY_VALUE(enb_module_idP, ue_module_idP, eNB_flagP, rb_idP, srb_flagP); hashtable_rc_t h_rc; h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); if (h_rc == HASH_TABLE_OK) { - rlc_p = &rlc_union_p->rlc.am; + l_rlc_p = &rlc_union_p->rlc.am; if ((config_am_pP->ul_AM_RLC.maxRetxThreshold <= UL_AM_RLC__maxRetxThreshold_t32) && (config_am_pP->ul_AM_RLC.pollPDU<=PollPDU_pInfinity) && (config_am_pP->ul_AM_RLC.pollByte<PollByte_spare1) && @@ -206,9 +206,9 @@ void config_req_rlc_am_asn1 ( ue_module_idP, rb_idP); - rlc_am_init(rlc_p,frameP); - rlc_am_set_debug_infos(rlc_p, frameP, eNB_flagP, srb_flagP, enb_module_idP, ue_module_idP, rb_idP); - rlc_am_configure(rlc_p, + rlc_am_init(l_rlc_p,frameP); + rlc_am_set_debug_infos(l_rlc_p, frameP, eNB_flagP, srb_flagP, enb_module_idP, ue_module_idP, rb_idP); + rlc_am_configure(l_rlc_p, frameP, maxRetxThreshold_tab[config_am_pP->ul_AM_RLC.maxRetxThreshold], pollPDU_tab[config_am_pP->ul_AM_RLC.pollPDU], @@ -662,6 +662,7 @@ rlc_am_mac_data_request (void *rlc_pP, frame_t frameP) (l_rlc_p->is_enb) ? "eNB" : "UE", l_rlc_p->enb_module_id, l_rlc_p->ue_module_id, + l_rlc_p->rb_id, nb_bytes_requested_by_mac, data_req.data.nb_elements); } @@ -936,90 +937,138 @@ void rlc_am_data_req (void *rlc_pP, frame_t frameP, mem_block_t * sdu_pP) { //----------------------------------------------------------------------------- - rlc_am_entity_t *rlc_p = (rlc_am_entity_t *) rlc_pP; + rlc_am_entity_t *l_rlc_p = (rlc_am_entity_t *) rlc_pP; uint32_t mui; uint16_t data_offset; uint16_t data_size; uint8_t conf; +#if defined(ENABLE_ITTI) + char message_string[7000]; + size_t message_string_size = 0; + MessageDef *msg_p; + int octet_index, index; +#endif - - if ((rlc_p->input_sdus[rlc_p->next_sdu_index].mem_block == NULL) && - (rlc_p->input_sdus[rlc_p->next_sdu_index].flags.segmented == 0) && - (((rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE) != rlc_p->current_sdu_index)) { + if ((l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mem_block == NULL) && + (l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmented == 0) && + (((l_rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE) != l_rlc_p->current_sdu_index)) { - memset(&rlc_p->input_sdus[rlc_p->next_sdu_index], 0, sizeof(rlc_am_tx_sdu_management_t)); - rlc_p->input_sdus[rlc_p->next_sdu_index].mem_block = sdu_pP; + memset(&l_rlc_p->input_sdus[l_rlc_p->next_sdu_index], 0, sizeof(rlc_am_tx_sdu_management_t)); + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mem_block = sdu_pP; mui = ((struct rlc_am_data_req *) (sdu_pP->data))->mui; data_offset = ((struct rlc_am_data_req *) (sdu_pP->data))->data_offset; data_size = ((struct rlc_am_data_req *) (sdu_pP->data))->data_size; conf = ((struct rlc_am_data_req *) (sdu_pP->data))->conf; +# if defined(ENABLE_ITTI) + message_string_size += sprintf(&message_string[message_string_size], "Bearer : %u\n", l_rlc_p->rb_id); + message_string_size += sprintf(&message_string[message_string_size], "SDU size : %u\n", data_size); + message_string_size += sprintf(&message_string[message_string_size], "MUI : %u\n", mui); + message_string_size += sprintf(&message_string[message_string_size], "CONF : %u\n", conf); + + message_string_size += sprintf(&message_string[message_string_size], "\nPayload : \n"); + message_string_size += sprintf(&message_string[message_string_size], "------+-------------------------------------------------|\n"); + message_string_size += sprintf(&message_string[message_string_size], " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); + message_string_size += sprintf(&message_string[message_string_size], "------+-------------------------------------------------|\n"); + for (octet_index = 0; octet_index < data_size; octet_index++) { + if ((octet_index % 16) == 0){ + if (octet_index != 0) { + message_string_size += sprintf(&message_string[message_string_size], " |\n"); + } + message_string_size += sprintf(&message_string[message_string_size], " %04d |", octet_index); + } + /* + * Print every single octet in hexadecimal form + */ + message_string_size += sprintf(&message_string[message_string_size], " %02x", (uint8_t*)(&sdu_pP->data[data_offset])[octet_index]); + /* + * Align newline and pipes according to the octets in groups of 2 + */ + } + /* + * Append enough spaces and put final pipe + */ + for (index = octet_index; index < 16; ++index) { + message_string_size += sprintf(&message_string[message_string_size], " "); + } + message_string_size += sprintf(&message_string[message_string_size], " |\n"); + + msg_p = itti_alloc_new_message_sized (l_rlc_p->is_enb > 0 ? TASK_RLC_ENB:TASK_RLC_UE , RLC_AM_SDU_REQ, message_string_size + sizeof (IttiMsgText)); + msg_p->ittiMsg.rlc_am_sdu_req.size = message_string_size; + memcpy(&msg_p->ittiMsg.rlc_am_sdu_req.text, message_string, message_string_size); - rlc_p->stat_tx_pdcp_sdu += 1; - rlc_p->stat_tx_pdcp_bytes += data_size; - - rlc_p->input_sdus[rlc_p->next_sdu_index].mui = mui; - rlc_p->input_sdus[rlc_p->next_sdu_index].sdu_size = data_size; - //rlc_p->input_sdus[rlc_p->next_sdu_index].confirm = conf; - - rlc_p->sdu_buffer_occupancy += data_size; - rlc_p->nb_sdu += 1; - rlc_p->nb_sdu_no_segmented += 1; - - rlc_p->input_sdus[rlc_p->next_sdu_index].first_byte = (uint8_t*)(&sdu_pP->data[data_offset]); - rlc_p->input_sdus[rlc_p->next_sdu_index].sdu_remaining_size = rlc_p->input_sdus[rlc_p->next_sdu_index].sdu_size; - rlc_p->input_sdus[rlc_p->next_sdu_index].sdu_segmented_size = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].sdu_creation_time = frameP; - rlc_p->input_sdus[rlc_p->next_sdu_index].nb_pdus = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].nb_pdus_ack = 0; - //rlc_p->input_sdus[rlc_p->next_sdu_index].nb_pdus_time = 0; - //rlc_p->input_sdus[rlc_p->next_sdu_index].nb_pdus_internal_use = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].flags.discarded = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].flags.segmented = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].flags.segmentation_in_progress = 0; - rlc_p->input_sdus[rlc_p->next_sdu_index].flags.no_new_sdu_segmented_in_last_pdu = 0; - //rlc_p->input_sdus[rlc_p->next_sdu_index].li_index_for_discard = -1; - rlc_p->next_sdu_index = (rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; + if (l_rlc_p->is_enb) { + itti_send_msg_to_task(TASK_UNKNOWN, l_rlc_p->enb_module_id, msg_p); + } else { + itti_send_msg_to_task(TASK_UNKNOWN, l_rlc_p->ue_module_id + NB_eNB_INST, msg_p); + } +# endif + + l_rlc_p->stat_tx_pdcp_sdu += 1; + l_rlc_p->stat_tx_pdcp_bytes += data_size; + + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mui = mui; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].sdu_size = data_size; + //l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].confirm = conf; + + l_rlc_p->sdu_buffer_occupancy += data_size; + l_rlc_p->nb_sdu += 1; + l_rlc_p->nb_sdu_no_segmented += 1; + + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].first_byte = (uint8_t*)(&sdu_pP->data[data_offset]); + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].sdu_remaining_size = l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].sdu_size; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].sdu_segmented_size = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].sdu_creation_time = frameP; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].nb_pdus = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].nb_pdus_ack = 0; + //l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].nb_pdus_time = 0; + //l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].nb_pdus_internal_use = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.discarded = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmented = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmentation_in_progress = 0; + l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.no_new_sdu_segmented_in_last_pdu = 0; + //l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].li_index_for_discard = -1; + l_rlc_p->next_sdu_index = (l_rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; LOG_I(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ size %d Bytes, NB SDU %d current_sdu_index=%d next_sdu_index=%d conf %d mui %d\n", frameP, - (rlc_p->is_enb) ? "eNB" : "UE", - rlc_p->enb_module_id, - rlc_p->ue_module_id, - rlc_p->rb_id, + (l_rlc_p->is_enb) ? "eNB" : "UE", + l_rlc_p->enb_module_id, + l_rlc_p->ue_module_id, + l_rlc_p->rb_id, data_size, - rlc_p->nb_sdu, - rlc_p->current_sdu_index, - rlc_p->next_sdu_index, + l_rlc_p->nb_sdu, + l_rlc_p->current_sdu_index, + l_rlc_p->next_sdu_index, conf, mui); } else { LOG_W(RLC, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ BUFFER FULL, NB SDU %d current_sdu_index=%d next_sdu_index=%d size_input_sdus_buffer=%d\n", frameP, - (rlc_p->is_enb) ? "eNB" : "UE", - rlc_p->enb_module_id, - rlc_p->ue_module_id, - rlc_p->rb_id, - rlc_p->nb_sdu, - rlc_p->current_sdu_index, - rlc_p->next_sdu_index, + (l_rlc_p->is_enb) ? "eNB" : "UE", + l_rlc_p->enb_module_id, + l_rlc_p->ue_module_id, + l_rlc_p->rb_id, + l_rlc_p->nb_sdu, + l_rlc_p->current_sdu_index, + l_rlc_p->next_sdu_index, RLC_AM_SDU_CONTROL_BUFFER_SIZE); - LOG_W(RLC, " input_sdus[].mem_block=%p next input_sdus[].flags.segmented=%d\n", rlc_p->input_sdus[rlc_p->next_sdu_index].mem_block, rlc_p->input_sdus[rlc_p->next_sdu_index].flags.segmented); - rlc_p->stat_tx_pdcp_sdu_discarded += 1; - rlc_p->stat_tx_pdcp_bytes_discarded += ((struct rlc_am_data_req *) (sdu_pP->data))->data_size; + LOG_W(RLC, " input_sdus[].mem_block=%p next input_sdus[].flags.segmented=%d\n", l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mem_block, l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmented); + l_rlc_p->stat_tx_pdcp_sdu_discarded += 1; + l_rlc_p->stat_tx_pdcp_bytes_discarded += ((struct rlc_am_data_req *) (sdu_pP->data))->data_size; free_mem_block (sdu_pP); #if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) AssertFatal(0, "[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] RLC_AM_DATA_REQ size %d Bytes, SDU DROPPED, INPUT BUFFER OVERFLOW NB SDU %d current_sdu_index=%d next_sdu_index=%d \n", frameP, - (rlc_p->is_enb) ? "eNB" : "UE", - rlc_p->enb_module_id, - rlc_p->ue_module_id, - rlc_p->rb_id, + (l_rlc_p->is_enb) ? "eNB" : "UE", + l_rlc_p->enb_module_id, + l_rlc_p->ue_module_id, + l_rlc_p->rb_id, data_size, - rlc_p->nb_sdu, - rlc_p->current_sdu_index, - rlc_p->next_sdu_index); + l_rlc_p->nb_sdu, + l_rlc_p->current_sdu_index, + l_rlc_p->next_sdu_index); #endif } }