No ring buffer for input SDUs but list ('infinite' capacity), may have corrected also concurrency problems (sdu mngt pointer)

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6044 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Lionel Gauthier
2014-11-20 12:29:44 +00:00
parent 2ba14ef285
commit f747a4dabd
4 changed files with 128 additions and 120 deletions
+26 -26
View File
@@ -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; uint16_t sdu_remaining_size = 0;
int32_t diff_time=0; int32_t diff_time=0;
rlc_um_entity_t *rlc_p = NULL; 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_pdus = 0;
status_resp.buffer_occupancy_in_bytes = 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; rlc_p->nb_bytes_requested_by_mac = tbs_sizeP;
status_resp.buffer_occupancy_in_bytes = rlc_um_get_buffer_occupancy (rlc_p); 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_bytes += rlc_p->tx_header_min_length_in_bytes;
status_resp.buffer_occupancy_in_pdus = rlc_p->nb_sdu; 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; 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) ; 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) ; //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_size = ((struct rlc_um_tx_sdu_management *) mb_p->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_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; status_resp.head_sdu_remaining_size_to_send = sdu_remaining_size;
if (sdu_size == sdu_remaining_size) { if (sdu_size == sdu_remaining_size) {
status_resp.head_sdu_is_segmented = 0; status_resp.head_sdu_is_segmented = 0;
} }
else { else {
status_resp.head_sdu_is_segmented = 1; status_resp.head_sdu_is_segmented = 1;
} }
} else { } else {
} }
@@ -624,7 +625,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP)
uint16_t data_size; uint16_t data_size;
#endif #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, frameP,
(rlc_p->is_enb) ? "eNB" : "UE", (rlc_p->is_enb) ? "eNB" : "UE",
rlc_p->enb_module_id, 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, rlc_p->rb_id,
((struct rlc_um_data_req *) (sdu_pP->data))->data_size, ((struct rlc_um_data_req *) (sdu_pP->data))->data_size,
rlc_p->buffer_occupancy, rlc_p->buffer_occupancy,
rlc_p->nb_sdu, rlc_p->input_sdus.nb_elements);
rlc_p->current_sdu_index,
rlc_p->next_sdu_index); /*rlc_util_print_hex_octets(
rlc_util_print_hex_octets(
RLC, RLC,
(uint8_t*)&sdu_pP->data[sizeof (struct rlc_um_data_req_alloc)], (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 /*#ifndef USER_MODE
rlc_um_time_us = (unsigned long int)(rt_get_time_ns ()/(RTIME)1000); 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; 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); msg ("[RLC_UM_LITE][RB %d] at time %2d:%2d.%6d\n", rlc_p->rb_id, min, sec , usec);
#endif*/ #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 // 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; ((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->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))->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 *) ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_remaining_size = ((struct rlc_um_tx_sdu_management *)
(sdu_pP->data))->sdu_size; (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_segmented_size = 0;
((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_creation_time = frameP; ((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_sdu += 1;
rlc_p->stat_tx_pdcp_bytes += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; 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); LOG_T(RLC, "%s", message_string);
#endif #endif
# 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", LOG_W(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02u/%02u][RB %02d] RLC-UM_DATA_REQ input buffer full SDU garbaged\n",
frameP, frameP,
(rlc_p->is_enb) ? "eNB" : "UE", (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->ue_module_id,
rlc_p->rb_id); rlc_p->rb_id);
#endif #endif
} }*/
} }
@@ -240,6 +240,7 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP)
memset (rlc_pP, 0, sizeof (rlc_um_entity_t)); memset (rlc_pP, 0, sizeof (rlc_um_entity_t));
// TX SIDE // TX SIDE
list_init (&rlc_pP->pdus_to_mac_layer, NULL); 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->protocol_state = RLC_NULL_STATE;
//rlc_pP->nb_sdu = 0; //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; rlc_pP->tx_header_min_length_in_bytes = 2;
// SPARE : not 3GPP // SPARE : not 3GPP
#ifdef JUMBO_FRAME /*#ifdef JUMBO_FRAME
rlc_pP->size_input_sdus_buffer =1024; rlc_pP->size_input_sdus_buffer =1024;
#else #else
rlc_pP->size_input_sdus_buffer =128; 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 *)); rlc_pP->input_sdus = calloc(1 , rlc_pP->size_input_sdus_buffer * sizeof (void *));
} }*/
if (rlc_pP->dar_buffer == NULL) { if (rlc_pP->dar_buffer == NULL) {
rlc_pP->dar_buffer = calloc (1, 1024 * sizeof (void *)); 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->buffer_occupancy = 0;
rlc_pP->nb_sdu = 0; //rlc_pP->nb_sdu = 0;
rlc_pP->next_sdu_index = 0; //rlc_pP->next_sdu_index = 0;
rlc_pP->current_sdu_index = 0; //rlc_pP->current_sdu_index = 0;
// TX SIDE // TX SIDE
rlc_pP->vt_us = 0; rlc_pP->vt_us = 0;
@@ -304,8 +305,9 @@ rlc_um_cleanup (rlc_um_entity_t * const rlc_pP)
int index; int index;
// TX SIDE // TX SIDE
list_free (&rlc_pP->pdus_to_mac_layer); 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++) { for (index = 0; index < rlc_pP->size_input_sdus_buffer; index++) {
if (rlc_pP->input_sdus[index]) { if (rlc_pP->input_sdus[index]) {
free_mem_block (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); free (rlc_pP->input_sdus);
rlc_pP->input_sdus = NULL; rlc_pP->input_sdus = NULL;
} }*/
// RX SIDE // RX SIDE
list_free (&rlc_pP->pdus_from_mac_layer); list_free (&rlc_pP->pdus_from_mac_layer);
if ((rlc_pP->output_sdu_in_construction)) { if ((rlc_pP->output_sdu_in_construction)) {
@@ -93,11 +93,12 @@ typedef struct rlc_um_entity_s {
// tranmission // tranmission
//----------------------------- //-----------------------------
// sdu communication; // sdu communication;
mem_block_t **input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). Should be accessed as an array. */ list_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. */ //mem_block_t **input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). Should be accessed as an array. */
uint16_t nb_sdu; /*!< \brief Total number of SDUs in input_sdus[] */ //uint16_t size_input_sdus_buffer; /*!< \brief Size of the input SDU buffer. */
uint16_t next_sdu_index; /*!< \brief Next SDU index for a new incomin SDU in input_sdus[]. */ //uint16_t nb_sdu; /*!< \brief Total number of SDUs in input_sdus[] */
uint16_t current_sdu_index; /*!< \brief Current SDU index in input_sdus array to be segmented. */ //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.*/ 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. */ 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. */ list_t pdus_to_mac_layer; /*!< \brief PDUs buffered for transmission to MAC layer. */
+85 -80
View File
@@ -68,7 +68,7 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP)
unsigned int num_fill_sdu; unsigned int num_fill_sdu;
unsigned int test_num_li; unsigned int test_num_li;
unsigned int fill_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 data_pdu_size;
unsigned int fi_first_byte_pdu_is_first_byte_sdu; 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 list_init (&pdus, NULL); // param string identifying the list is NULL
pdu_mem_p = 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) #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", LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT10 nb_bytes_to_transmit %d BO %d\n",
frameP, frameP,
@@ -112,10 +113,10 @@ rlc_um_segment_10 (rlc_um_entity_t *rlc_pP,frame_t frameP)
#endif #endif
// pdu_p management // pdu_p management
if (!pdu_mem_p) { if (!pdu_mem_p) {
if (rlc_pP->nb_sdu <= 1) { if (rlc_pP->input_sdus.nb_elements <= 1) {
max_li_overhead = 0; max_li_overhead = 0;
} else { } 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)) { 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; 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; continue_fill_pdu_with_sdu = 1;
num_fill_sdu = 0; num_fill_sdu = 0;
test_num_li = 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_pdu_remaining_size = pdu_remaining_size;
test_li_length_in_bytes = 1; test_li_length_in_bytes = 1;
test_remaining_size_to_substract = 0; test_remaining_size_to_substract = 0;
test_remaining_num_li_to_substract = 0; test_remaining_num_li_to_substract = 0;
while ((rlc_pP->input_sdus[sdu_buffer_index]) && (continue_fill_pdu_with_sdu > 0)) { while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) {
sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[sdu_buffer_index]->data)); sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data));
if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) { if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) {
// no LI // 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; test_remaining_num_li_to_substract = 0;
pdu_remaining_size = pdu_remaining_size - 1; 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) { if (test_remaining_num_li_to_substract > 0) {
// there is a LI that is not necessary // 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_first_byte_pdu_is_first_byte_sdu = 0;
fi_last_byte_pdu_is_last_byte_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 0;
sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
if ( 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 *) (sdu_in_buffer->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_size) {
fi_first_byte_pdu_is_first_byte_sdu = 1; 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)) { while ((sdu_in_buffer) && (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)); sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data));
if (sdu_mngt_p->sdu_segmented_size == 0) { if (sdu_mngt_p->sdu_segmented_size == 0) {
#if defined(TRACE_RLC_UM_SEGMENT) #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", 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); sdu_mngt_p->sdu_size);
#endif #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 (sdu_mngt_p->sdu_remaining_size > pdu_remaining_size) {
#if defined(TRACE_RLC_UM_SEGMENT) #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 // free SDU
rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size;
free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus);
rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; free_mem_block (sdu_in_buffer);
rlc_pP->nb_sdu -= 1; sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; sdu_mngt_p = NULL;
fi_last_byte_pdu_is_last_byte_sdu = 1; fi_last_byte_pdu_is_last_byte_sdu = 1;
// fi will indicate end of PDU is end of SDU, no need for LI // 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++; e_li_p++;
} }
pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes);
// free SDU // free SDU
rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size;
free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus);
rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; free_mem_block (sdu_in_buffer);
rlc_pP->nb_sdu -= 1; sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; sdu_mngt_p = NULL;
pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes);
} else { } else {
#if defined(TRACE_RLC_UM_SEGMENT) #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", 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
#endif #endif
memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); 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 // reduce the size of the PDU
continue_fill_pdu_with_sdu = 0; continue_fill_pdu_with_sdu = 0;
fi_last_byte_pdu_is_last_byte_sdu = 1; fi_last_byte_pdu_is_last_byte_sdu = 1;
pdu_remaining_size = pdu_remaining_size - sdu_mngt_p->sdu_remaining_size; 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; list_t pdus;
signed int pdu_remaining_size; signed int pdu_remaining_size = 0;
signed int test_pdu_remaining_size; signed int test_pdu_remaining_size = 0;
int nb_bytes_to_transmit = rlc_pP->nb_bytes_requested_by_mac; int nb_bytes_to_transmit = rlc_pP->nb_bytes_requested_by_mac;
rlc_um_pdu_sn_5_t *pdu_p; rlc_um_pdu_sn_5_t *pdu_p = NULL;
struct mac_tb_req *pdu_tb_req_p; struct mac_tb_req *pdu_tb_req_p = NULL;
mem_block_t *pdu_mem_p; mem_block_t *pdu_mem_p = NULL;
char *data; char *data = NULL;
char *data_sdu_p; char *data_sdu_p = NULL;
rlc_um_e_li_t *e_li_p; rlc_um_e_li_t *e_li_p = NULL;
struct rlc_um_tx_sdu_management *sdu_mngt_p; struct rlc_um_tx_sdu_management *sdu_mngt_p = NULL;
unsigned int li_length_in_bytes; unsigned int li_length_in_bytes = 0;
unsigned int test_li_length_in_bytes; unsigned int test_li_length_in_bytes = 0;
unsigned int test_remaining_size_to_substract; unsigned int test_remaining_size_to_substract = 0;
unsigned int test_remaining_num_li_to_substract; unsigned int test_remaining_num_li_to_substract = 0;
unsigned int continue_fill_pdu_with_sdu; unsigned int continue_fill_pdu_with_sdu = 0;
unsigned int num_fill_sdu; unsigned int num_fill_sdu = 0;
unsigned int test_num_li; unsigned int test_num_li = 0;
unsigned int fill_num_li; unsigned int fill_num_li = 0;
unsigned int sdu_buffer_index; mem_block_t *sdu_in_buffer = NULL;
unsigned int data_pdu_size; unsigned int data_pdu_size = 0;
unsigned int fi_first_byte_pdu_is_first_byte_sdu; unsigned int fi_first_byte_pdu_is_first_byte_sdu = 0;
unsigned int fi_last_byte_pdu_is_last_byte_sdu; unsigned int fi_last_byte_pdu_is_last_byte_sdu = 0;
unsigned int fi; unsigned int fi = 0;
unsigned int max_li_overhead; unsigned int max_li_overhead = 0;
if (nb_bytes_to_transmit < 2) { if (nb_bytes_to_transmit < 2) {
#if defined(TRACE_RLC_UM_SEGMENT) #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 list_init (&pdus, NULL); // param string identifying the list is NULL
pdu_mem_p = 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) #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", LOG_D(RLC, "[FRAME %05u][%s][RLC_UM][MOD %u/%u][RB %u] SEGMENT5 nb_bytes_to_transmit %d BO %d\n",
frameP, frameP,
@@ -549,10 +553,10 @@ rlc_um_segment_5 (rlc_um_entity_t *rlc_pP,frame_t frameP)
#endif #endif
// pdu_p management // pdu_p management
if (!pdu_mem_p) { if (!pdu_mem_p) {
if (rlc_pP->nb_sdu <= 1) { if (rlc_pP->input_sdus.nb_elements <= 1) {
max_li_overhead = 0; max_li_overhead = 0;
} else { } 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)) { 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; 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; continue_fill_pdu_with_sdu = 1;
num_fill_sdu = 0; num_fill_sdu = 0;
test_num_li = 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_pdu_remaining_size = pdu_remaining_size;
test_li_length_in_bytes = 1; test_li_length_in_bytes = 1;
test_remaining_size_to_substract = 0; test_remaining_size_to_substract = 0;
test_remaining_num_li_to_substract = 0; test_remaining_num_li_to_substract = 0;
while ((rlc_pP->input_sdus[sdu_buffer_index]) && (continue_fill_pdu_with_sdu > 0)) { while ((sdu_in_buffer) && (continue_fill_pdu_with_sdu > 0)) {
sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (rlc_pP->input_sdus[sdu_buffer_index]->data)); sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data));
if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) { if (sdu_mngt_p->sdu_remaining_size > test_pdu_remaining_size) {
// no LI // 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; pdu_remaining_size = pdu_remaining_size - 1;
data_pdu_size -= 1;//modifier pour duy 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) { if (test_remaining_num_li_to_substract > 0) {
// there is a LI that is not necessary // 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_first_byte_pdu_is_first_byte_sdu = 0;
fi_last_byte_pdu_is_last_byte_sdu = 0; fi_last_byte_pdu_is_last_byte_sdu = 0;
sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
if ( 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 *) (sdu_in_buffer->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_size) {
fi_first_byte_pdu_is_first_byte_sdu = 1; 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)) { while ((sdu_in_buffer) && (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)); sdu_mngt_p = ((struct rlc_um_tx_sdu_management *) (sdu_in_buffer->data));
if (sdu_mngt_p->sdu_segmented_size == 0) { if (sdu_mngt_p->sdu_segmented_size == 0) {
#if defined(TRACE_RLC_UM_SEGMENT) #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", 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); sdu_mngt_p->sdu_size);
#endif #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 (sdu_mngt_p->sdu_remaining_size > pdu_remaining_size) {
#if defined(TRACE_RLC_UM_SEGMENT) #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); memcpy(data, data_sdu_p, pdu_remaining_size);
// free SDU // free SDU
rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size;
free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus);
rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; free_mem_block (sdu_in_buffer);
rlc_pP->nb_sdu -= 1; sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; sdu_mngt_p = NULL;
fi_last_byte_pdu_is_last_byte_sdu = 1; fi_last_byte_pdu_is_last_byte_sdu = 1;
// fi will indicate end of PDU is end of SDU, no need for LI // 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++; e_li_p++;
} }
pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes);
// free SDU // free SDU
rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size;
free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus);
rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; free_mem_block (sdu_in_buffer);
rlc_pP->nb_sdu -= 1; sdu_in_buffer = list_get_head(&rlc_pP->input_sdus);
rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; sdu_mngt_p = NULL;
pdu_remaining_size = pdu_remaining_size - (sdu_mngt_p->sdu_remaining_size + li_length_in_bytes);
} else { } else {
#if defined(TRACE_RLC_UM_SEGMENT) #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", 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); assert(1!=1);
#endif #endif
memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); 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 // reduce the size of the PDU
continue_fill_pdu_with_sdu = 0; continue_fill_pdu_with_sdu = 0;
fi_last_byte_pdu_is_last_byte_sdu = 1; fi_last_byte_pdu_is_last_byte_sdu = 1;
pdu_remaining_size = pdu_remaining_size - sdu_mngt_p->sdu_remaining_size; 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;
} }
} }