diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c index ea64dc7117..fecedc98ed 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -406,6 +406,7 @@ rlc_um_mac_status_indication (void *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP uint16_t sdu_remaining_size = 0; int32_t diff_time=0; rlc_um_entity_t *rlc_p = NULL; + mem_block_t *mb_p = NULL; status_resp.buffer_occupancy_in_pdus = 0; status_resp.buffer_occupancy_in_bytes = 0; @@ -421,25 +422,25 @@ rlc_um_mac_status_indication (void *rlc_pP, frame_t frameP, eNB_flag_t eNB_flagP rlc_p->nb_bytes_requested_by_mac = tbs_sizeP; status_resp.buffer_occupancy_in_bytes = rlc_um_get_buffer_occupancy (rlc_p); - if (status_resp.buffer_occupancy_in_bytes > 0) { + if ((status_resp.buffer_occupancy_in_bytes > 0) && ((mb_p = list_get_head(&rlc_p->input_sdus)) != NULL)) { - status_resp.buffer_occupancy_in_bytes += rlc_p->tx_header_min_length_in_bytes; - status_resp.buffer_occupancy_in_pdus = rlc_p->nb_sdu; + status_resp.buffer_occupancy_in_bytes += rlc_p->tx_header_min_length_in_bytes; + status_resp.buffer_occupancy_in_pdus = rlc_p->input_sdus.nb_elements; - diff_time = frameP - ((struct rlc_um_tx_sdu_management *) (rlc_p->input_sdus[rlc_p->current_sdu_index])->data)->sdu_creation_time; - status_resp.head_sdu_creation_time = (diff_time > 0 ) ? (uint32_t) diff_time : (uint32_t)(0xffffffff - diff_time + frameP) ; - //msg("rlc_p status for frameP %d diff time %d resp %d\n", frameP, diff_time,status_resp.head_sdu_creation_time) ; + diff_time = frameP - ((struct rlc_um_tx_sdu_management *)mb_p->data)->sdu_creation_time; + status_resp.head_sdu_creation_time = (diff_time > 0 ) ? (uint32_t) diff_time : (uint32_t)(0xffffffff - diff_time + frameP) ; + //msg("rlc_p status for frameP %d diff time %d resp %d\n", frameP, diff_time,status_resp.head_sdu_creation_time) ; - sdu_size = ((struct rlc_um_tx_sdu_management *) (rlc_p->input_sdus[rlc_p->current_sdu_index])->data)->sdu_size; - sdu_remaining_size = ((struct rlc_um_tx_sdu_management *) (rlc_p->input_sdus[rlc_p->current_sdu_index])->data)->sdu_remaining_size; + sdu_size = ((struct rlc_um_tx_sdu_management *) mb_p->data)->sdu_size; + sdu_remaining_size = ((struct rlc_um_tx_sdu_management *) mb_p->data)->sdu_remaining_size; - status_resp.head_sdu_remaining_size_to_send = sdu_remaining_size; - if (sdu_size == sdu_remaining_size) { + status_resp.head_sdu_remaining_size_to_send = sdu_remaining_size; + if (sdu_size == sdu_remaining_size) { status_resp.head_sdu_is_segmented = 0; - } - else { - status_resp.head_sdu_is_segmented = 1; - } + } + else { + status_resp.head_sdu_is_segmented = 1; + } } else { } @@ -624,7 +625,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) uint16_t data_size; #endif - LOG_D(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02u/%02u][RB %02d] RLC_UM_DATA_REQ size %d Bytes, BO %d , NB SDU %d current_sdu_index=%d next_sdu_index=%d\n", + LOG_D(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02u/%02u][RB %02d] RLC_UM_DATA_REQ size %d Bytes, BO %d , NB SDU %d\n", frameP, (rlc_p->is_enb) ? "eNB" : "UE", rlc_p->enb_module_id, @@ -632,13 +633,12 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) rlc_p->rb_id, ((struct rlc_um_data_req *) (sdu_pP->data))->data_size, rlc_p->buffer_occupancy, - rlc_p->nb_sdu, - rlc_p->current_sdu_index, - rlc_p->next_sdu_index); - rlc_util_print_hex_octets( + rlc_p->input_sdus.nb_elements); + + /*rlc_util_print_hex_octets( RLC, (uint8_t*)&sdu_pP->data[sizeof (struct rlc_um_data_req_alloc)], - ((struct rlc_um_data_req *) (sdu_pP->data))->data_size); + ((struct rlc_um_data_req *) (sdu_pP->data))->data_size);*/ /*#ifndef USER_MODE rlc_um_time_us = (unsigned long int)(rt_get_time_ns ()/(RTIME)1000); @@ -648,18 +648,17 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) usec = rlc_um_time_us % 1000000; msg ("[RLC_UM_LITE][RB %d] at time %2d:%2d.%6d\n", rlc_p->rb_id, min, sec , usec); #endif*/ - if (rlc_p->input_sdus[rlc_p->next_sdu_index] == NULL) { - rlc_p->input_sdus[rlc_p->next_sdu_index] = sdu_pP; + // IMPORTANT : do not change order of affectations ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size = ((struct rlc_um_data_req *) (sdu_pP->data))->data_size; rlc_p->buffer_occupancy += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; - rlc_p->nb_sdu += 1; + //rlc_p->nb_sdu += 1; ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->first_byte = (uint8_t*)&sdu_pP->data[sizeof (struct rlc_um_data_req_alloc)]; ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_remaining_size = ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_segmented_size = 0; ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_creation_time = frameP; - rlc_p->next_sdu_index = (rlc_p->next_sdu_index + 1) % rlc_p->size_input_sdus_buffer; + //rlc_p->next_sdu_index = (rlc_p->next_sdu_index + 1) % rlc_p->size_input_sdus_buffer; rlc_p->stat_tx_pdcp_sdu += 1; rlc_p->stat_tx_pdcp_bytes += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; @@ -710,8 +709,9 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) LOG_T(RLC, "%s", message_string); #endif # endif + list_add_tail_eurecom(sdu_pP, &rlc_p->input_sdus); - } else { + /*} else { LOG_W(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02u/%02u][RB %02d] RLC-UM_DATA_REQ input buffer full SDU garbaged\n", frameP, (rlc_p->is_enb) ? "eNB" : "UE", @@ -731,5 +731,5 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) rlc_p->ue_module_id, rlc_p->rb_id); #endif - } + }*/ } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index 7669756a6a..e7e4df8e50 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -240,6 +240,7 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP) memset (rlc_pP, 0, sizeof (rlc_um_entity_t)); // TX SIDE list_init (&rlc_pP->pdus_to_mac_layer, NULL); + list_init (&rlc_pP->input_sdus, NULL); rlc_pP->protocol_state = RLC_NULL_STATE; //rlc_pP->nb_sdu = 0; @@ -262,15 +263,15 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP) rlc_pP->tx_header_min_length_in_bytes = 2; // SPARE : not 3GPP -#ifdef JUMBO_FRAME +/*#ifdef JUMBO_FRAME rlc_pP->size_input_sdus_buffer =1024; #else rlc_pP->size_input_sdus_buffer =128; -#endif +#endif*/ - if ((rlc_pP->input_sdus == NULL) && (rlc_pP->size_input_sdus_buffer > 0)) { + /*if ((rlc_pP->input_sdus == NULL) && (rlc_pP->size_input_sdus_buffer > 0)) { rlc_pP->input_sdus = calloc(1 , rlc_pP->size_input_sdus_buffer * sizeof (void *)); - } + }*/ if (rlc_pP->dar_buffer == NULL) { rlc_pP->dar_buffer = calloc (1, 1024 * sizeof (void *)); } @@ -285,9 +286,9 @@ rlc_um_reset_state_variables (rlc_um_entity_t * const rlc_pP) { //----------------------------------------------------------------------------- rlc_pP->buffer_occupancy = 0; - rlc_pP->nb_sdu = 0; - rlc_pP->next_sdu_index = 0; - rlc_pP->current_sdu_index = 0; + //rlc_pP->nb_sdu = 0; + //rlc_pP->next_sdu_index = 0; + //rlc_pP->current_sdu_index = 0; // TX SIDE rlc_pP->vt_us = 0; @@ -304,8 +305,9 @@ rlc_um_cleanup (rlc_um_entity_t * const rlc_pP) int index; // TX SIDE list_free (&rlc_pP->pdus_to_mac_layer); + list_free (&rlc_pP->input_sdus); - if (rlc_pP->input_sdus) { + /*if (rlc_pP->input_sdus) { for (index = 0; index < rlc_pP->size_input_sdus_buffer; index++) { if (rlc_pP->input_sdus[index]) { free_mem_block (rlc_pP->input_sdus[index]); @@ -313,7 +315,7 @@ rlc_um_cleanup (rlc_um_entity_t * const rlc_pP) } free (rlc_pP->input_sdus); rlc_pP->input_sdus = NULL; - } + }*/ // RX SIDE list_free (&rlc_pP->pdus_from_mac_layer); if ((rlc_pP->output_sdu_in_construction)) { diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h index ab087cd496..3e2b3a8ca6 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -93,11 +93,12 @@ typedef struct rlc_um_entity_s { // tranmission //----------------------------- // sdu communication; - mem_block_t **input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). Should be accessed as an array. */ - uint16_t size_input_sdus_buffer; /*!< \brief Size of the input SDU buffer. */ - uint16_t nb_sdu; /*!< \brief Total number of SDUs in input_sdus[] */ - uint16_t next_sdu_index; /*!< \brief Next SDU index for a new incomin SDU in input_sdus[]. */ - uint16_t current_sdu_index; /*!< \brief Current SDU index in input_sdus array to be segmented. */ + list_t input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). Should be accessed as an array. */ + //mem_block_t **input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). Should be accessed as an array. */ + //uint16_t size_input_sdus_buffer; /*!< \brief Size of the input SDU buffer. */ + //uint16_t nb_sdu; /*!< \brief Total number of SDUs in input_sdus[] */ + //uint16_t next_sdu_index; /*!< \brief Next SDU index for a new incomin SDU in input_sdus[]. */ + //uint16_t current_sdu_index; /*!< \brief Current SDU index in input_sdus array to be segmented. */ rlc_buffer_occupancy_t buffer_occupancy; /*!< \brief Number of bytes contained in input_sdus buffer.*/ uint32_t nb_bytes_requested_by_mac; /*!< \brief Number of bytes requested by lower layer for next transmission. */ list_t pdus_to_mac_layer; /*!< \brief PDUs buffered for transmission to MAC layer. */ diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c index a98283855b..2ff96d0fea 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c @@ -68,7 +68,7 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) unsigned int num_fill_sdu; unsigned int test_num_li; unsigned int fill_num_li; - unsigned int sdu_buffer_index; + mem_block_t *sdu_in_buffer = NULL; unsigned int data_pdu_size; unsigned int fi_first_byte_pdu_is_first_byte_sdu; @@ -99,7 +99,8 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) list_init (&pdus, NULL); // param string identifying the list is NULL pdu_mem_p = NULL; - while ((rlc_pP->input_sdus[rlc_pP->current_sdu_index]) && (nb_bytes_to_transmit > 0)) { + while ((list_get_head(&rlc_pP->input_sdus)) && (nb_bytes_to_transmit > 0)) { + #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT10 nb_bytes_to_transmit %d BO %d\n", frameP, @@ -112,10 +113,10 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) #endif // pdu_p management if (!pdu_mem_p) { - if (rlc_pP->nb_sdu <= 1) { + if (rlc_pP->input_sdus.nb_elements <= 1) { max_li_overhead = 0; } else { - max_li_overhead = (((rlc_pP->nb_sdu - 1) * 3) / 2) + ((rlc_pP->nb_sdu - 1) % 2); + max_li_overhead = (((rlc_pP->input_sdus.nb_elements - 1) * 3) / 2) + ((rlc_pP->input_sdus.nb_elements - 1) % 2); } if (nb_bytes_to_transmit >= (rlc_pP->buffer_occupancy + rlc_pP->tx_header_min_length_in_bytes + max_li_overhead)) { data_pdu_size = rlc_pP->buffer_occupancy + rlc_pP->tx_header_min_length_in_bytes + max_li_overhead; @@ -173,15 +174,15 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) continue_fill_pdu_with_sdu = 1; num_fill_sdu = 0; test_num_li = 0; - sdu_buffer_index = rlc_pP->current_sdu_index; + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); test_pdu_remaining_size = pdu_remaining_size; test_li_length_in_bytes = 1; test_remaining_size_to_substract = 0; test_remaining_num_li_to_substract = 0; - while ((rlc_pP->input_sdus[sdu_buffer_index]) && (continue_fill_pdu_with_sdu > 0)) { - sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[sdu_buffer_index]->data)); + while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) { + sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data)); if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) { // no LI @@ -232,7 +233,7 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) test_remaining_num_li_to_substract = 0; pdu_remaining_size = pdu_remaining_size - 1; } - sdu_buffer_index = (sdu_buffer_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = sdu_in_buffer->next; } if (test_remaining_num_li_to_substract > 0) { // there is a LI that is not necessary @@ -261,13 +262,14 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) fi_first_byte_pdu_is_first_byte_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 0; + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); if ( - ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data))->sdu_remaining_size == - ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data))->sdu_size) { + ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data))->sdu_remaining_size == + ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data))->sdu_size) { fi_first_byte_pdu_is_first_byte_sdu = 1; } - while ((rlc_pP->input_sdus[rlc_pP->current_sdu_index]) && (continue_fill_pdu_with_sdu > 0)) { - sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data)); + while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) { + sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data)); if (sdu_mngt_p->sdu_segmented_size == 0) { #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT10 GET NEW SDU %p AVAILABLE SIZE %d Bytes\n", @@ -292,7 +294,7 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) sdu_mngt_p->sdu_size); #endif } - data_sdu_p = &((rlc_pP->input_sdus[rlc_pP->current_sdu_index])->data[sizeof (struct rlc_um_tx_sdu_management) + sdu_mngt_p->sdu_segmented_size]); + data_sdu_p = &(sdu_in_buffer->data[sizeof (struct rlc_um_tx_sdu_management) + sdu_mngt_p->sdu_segmented_size]); if (sdu_mngt_p->sdu_remaining_size > pdu_remaining_size) { #if defined(TRACE_RLC_UM_SEGMENT) @@ -340,10 +342,11 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; + fi_last_byte_pdu_is_last_byte_sdu = 1; // fi will indicate end of PDU is end of SDU, no need for LI @@ -409,14 +412,15 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) e_li_p++; } + pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes); + // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; - pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes); } else { #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT10 Filling PDU with %d all remaining bytes of SDU and reduce TB size by %d bytes\n", @@ -434,17 +438,17 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP) #endif #endif memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); - // free SDU - rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; - // reduce the size of the PDU continue_fill_pdu_with_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 1; pdu_remaining_size = pdu_remaining_size - sdu_mngt_p->sdu_remaining_size; + // free SDU + rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; + } } @@ -486,32 +490,32 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) { //----------------------------------------------------------------------------- list_t pdus; - signed int pdu_remaining_size; - signed int test_pdu_remaining_size; + signed int pdu_remaining_size = 0; + signed int test_pdu_remaining_size = 0; int nb_bytes_to_transmit = rlc_pP->nb_bytes_requested_by_mac; - rlc_um_pdu_sn_5_t *pdu_p; - struct mac_tb_req *pdu_tb_req_p; - mem_block_t *pdu_mem_p; - char *data; - char *data_sdu_p; - rlc_um_e_li_t *e_li_p; - struct rlc_um_tx_sdu_management *sdu_mngt_p; - unsigned int li_length_in_bytes; - unsigned int test_li_length_in_bytes; - unsigned int test_remaining_size_to_substract; - unsigned int test_remaining_num_li_to_substract; - unsigned int continue_fill_pdu_with_sdu; - unsigned int num_fill_sdu; - unsigned int test_num_li; - unsigned int fill_num_li; - unsigned int sdu_buffer_index; - unsigned int data_pdu_size; + rlc_um_pdu_sn_5_t *pdu_p = NULL; + struct mac_tb_req *pdu_tb_req_p = NULL; + mem_block_t *pdu_mem_p = NULL; + char *data = NULL; + char *data_sdu_p = NULL; + rlc_um_e_li_t *e_li_p = NULL; + struct rlc_um_tx_sdu_management *sdu_mngt_p = NULL; + unsigned int li_length_in_bytes = 0; + unsigned int test_li_length_in_bytes = 0; + unsigned int test_remaining_size_to_substract = 0; + unsigned int test_remaining_num_li_to_substract = 0; + unsigned int continue_fill_pdu_with_sdu = 0; + unsigned int num_fill_sdu = 0; + unsigned int test_num_li = 0; + unsigned int fill_num_li = 0; + mem_block_t *sdu_in_buffer = NULL; + unsigned int data_pdu_size = 0; - unsigned int fi_first_byte_pdu_is_first_byte_sdu; - unsigned int fi_last_byte_pdu_is_last_byte_sdu; - unsigned int fi; - unsigned int max_li_overhead; + unsigned int fi_first_byte_pdu_is_first_byte_sdu = 0; + unsigned int fi_last_byte_pdu_is_last_byte_sdu = 0; + unsigned int fi = 0; + unsigned int max_li_overhead = 0; if (nb_bytes_to_transmit < 2) { #if defined(TRACE_RLC_UM_SEGMENT) @@ -536,7 +540,7 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) list_init (&pdus, NULL); // param string identifying the list is NULL pdu_mem_p = NULL; - while ((rlc_pP->input_sdus[rlc_pP->current_sdu_index]) && (nb_bytes_to_transmit > 0)) { + while ((list_get_head(&rlc_pP->input_sdus)) && (nb_bytes_to_transmit > 0)) { #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT5 nb_bytes_to_transmit %d BO %d\n", frameP, @@ -549,10 +553,10 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) #endif // pdu_p management if (!pdu_mem_p) { - if (rlc_pP->nb_sdu <= 1) { + if (rlc_pP->input_sdus.nb_elements <= 1) { max_li_overhead = 0; } else { - max_li_overhead = (((rlc_pP->nb_sdu - 1) * 3) / 2) + ((rlc_pP->nb_sdu - 1) % 2); + max_li_overhead = (((rlc_pP->input_sdus.nb_elements - 1) * 3) / 2) + ((rlc_pP->input_sdus.nb_elements - 1) % 2); } if (nb_bytes_to_transmit >= (rlc_pP->buffer_occupancy + rlc_pP->tx_header_min_length_in_bytes + max_li_overhead)) { data_pdu_size = rlc_pP->buffer_occupancy + rlc_pP->tx_header_min_length_in_bytes + max_li_overhead; @@ -610,15 +614,15 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) continue_fill_pdu_with_sdu = 1; num_fill_sdu = 0; test_num_li = 0; - sdu_buffer_index = rlc_pP->current_sdu_index; + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); test_pdu_remaining_size = pdu_remaining_size; test_li_length_in_bytes = 1; test_remaining_size_to_substract = 0; test_remaining_num_li_to_substract = 0; - while ((rlc_pP->input_sdus[sdu_buffer_index]) && (continue_fill_pdu_with_sdu > 0)) { - sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[sdu_buffer_index]->data)); + while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) { + sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data)); if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) { // no LI @@ -671,7 +675,7 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) pdu_remaining_size = pdu_remaining_size - 1; data_pdu_size -= 1;//modifier pour duy } - sdu_buffer_index = (sdu_buffer_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = sdu_in_buffer->next; } if (test_remaining_num_li_to_substract > 0) { // there is a LI that is not necessary @@ -700,13 +704,14 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) fi_first_byte_pdu_is_first_byte_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 0; + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); if ( - ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data))->sdu_remaining_size == - ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data))->sdu_size) { + ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data))->sdu_remaining_size == + ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data))->sdu_size) { fi_first_byte_pdu_is_first_byte_sdu = 1; } - while ((rlc_pP->input_sdus[rlc_pP->current_sdu_index]) && (continue_fill_pdu_with_sdu > 0)) { - sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data)); + while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) { + sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data)); if (sdu_mngt_p->sdu_segmented_size == 0) { #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT5 GET NEW SDU %p AVAILABLE SIZE %d Bytes\n", @@ -731,7 +736,7 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) sdu_mngt_p->sdu_size); #endif } - data_sdu_p = &((rlc_pP->input_sdus[rlc_pP->current_sdu_index])->data[sizeof (struct rlc_um_tx_sdu_management) + sdu_mngt_p->sdu_segmented_size]); + data_sdu_p = &(sdu_in_buffer->data[sizeof (struct rlc_um_tx_sdu_management) + sdu_mngt_p->sdu_segmented_size]); if (sdu_mngt_p->sdu_remaining_size > pdu_remaining_size) { #if defined(TRACE_RLC_UM_SEGMENT) @@ -777,10 +782,10 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) memcpy(data, data_sdu_p, pdu_remaining_size); // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; fi_last_byte_pdu_is_last_byte_sdu = 1; // fi will indicate end of PDU is end of SDU, no need for LI @@ -846,14 +851,15 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) e_li_p++; } + pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes); + // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; - pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes); } else { #if defined(TRACE_RLC_UM_SEGMENT) LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT5 Filling PDU with %d all remaining bytes of SDU and reduce TB size by %d bytes\n", @@ -869,17 +875,16 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP) assert(1!=1); #endif memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); - // free SDU - rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); - rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; - rlc_pP->nb_sdu -= 1; - rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; - // reduce the size of the PDU continue_fill_pdu_with_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 1; pdu_remaining_size = pdu_remaining_size - sdu_mngt_p->sdu_remaining_size; + // free SDU + rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; + sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); + free_mem_block (sdu_in_buffer); + sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); + sdu_mngt_p = NULL; } }