//----------------------------------------------------------------------------- void rlc_am_reassemble_pdu(rlc_am_entity_t* rlcP, u32_t frame, u8_t eNB_flag, mem_block_t* tbP) { //----------------------------------------------------------------------------- int i,j; rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tbP->data))->pdu_info; #ifdef TRACE_RLC_AM_REASSEMBLY LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n", frame, rlcP->module_id, rlcP->rb_id, pdu_info->sn); rlc_am_display_data_pdu_infos(rlcP, frame, pdu_info); #endif if (pdu_info->e == RLC_E_FIXED_PART_DATA_FIELD_FOLLOW) { switch (pdu_info->fi) { case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=11 (00)\n", frame, rlcP->module_id, rlcP->rb_id); #endif // one complete SDU rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=10 (01)\n", frame, rlcP->module_id, rlcP->rb_id); #endif // one beginning segment of SDU in PDU rlc_am_send_sdu(rlcP,frame,eNB_flag); // may be not necessary rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=01 (10)\n", frame, rlcP->module_id, rlcP->rb_id); #endif // one last segment of SDU //if (rlcP->reassembly_missing_sn_detected == 0) { rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); //} // else { clear sdu already done //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=00 (11)\n", frame, rlcP->module_id, rlcP->rb_id); #endif //if (rlcP->reassembly_missing_sn_detected == 0) { // one whole segment of SDU in PDU rlc_am_reassembly (pdu_info->payload, pdu_info->payload_size, rlcP,frame); //} else { // rlcP->reassembly_missing_sn_detected = 1; // not necessary but for readability of the code //} break; #ifdef USER_MODE default: assert(0 != 0); #endif } } else { switch (pdu_info->fi) { case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=11 (00) Li=", frame, rlcP->module_id, rlcP->rb_id); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); #endif // N complete SDUs rlc_am_send_sdu(rlcP,frame,eNB_flag); j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); } //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=10 (01) Li=", frame, rlcP->module_id, rlcP->rb_id); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); #endif // N complete SDUs + one segment of SDU in PDU rlc_am_send_sdu(rlcP,frame,eNB_flag); j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP, frame); } //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=01 (10) Li=", frame, rlcP->module_id, rlcP->rb_id); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); #endif // one last segment of SDU + N complete SDUs in PDU j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); } //rlcP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: #ifdef TRACE_RLC_AM_RX_DECODE LOG_D(RLC, "[FRAME %05d][RLC_AM][MOD %02d][RB %02d][REASSEMBLY PDU] TRY REASSEMBLY PDU FI=00 (11) Li=", frame, rlcP->module_id, rlcP->rb_id); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); #endif j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (&pdu_info->payload[j], pdu_info->li_list[i], rlcP,frame); rlc_am_send_sdu(rlcP,frame,eNB_flag); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (&pdu_info->payload[j], pdu_info->hidden_size, rlcP,frame); } else { #ifdef USER_MODE //assert (5!=5); #endif } //rlcP->reassembly_missing_sn_detected = 0; break; #ifdef USER_MODE default: assert(1 != 1); #endif } } free_mem_block(tbP); }
//----------------------------------------------------------------------------- void rlc_am_reassemble_pdu( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP, mem_block_t * const tb_pP) { int i,j; rlc_am_pdu_info_t* pdu_info = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), pdu_info->sn); #if TRACE_RLC_AM_RX_DECODE rlc_am_display_data_pdu_infos(ctxt_pP, rlc_pP, pdu_info); #endif if (pdu_info->e == RLC_E_FIXED_PART_DATA_FIELD_FOLLOW) { switch (pdu_info->fi) { case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=11 (00)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); // one complete SDU rlc_am_send_sdu(ctxt_pP, rlc_pP); // may be not necessary rlc_am_reassembly (ctxt_pP, rlc_pP, pdu_info->payload, pdu_info->payload_size); rlc_am_send_sdu(ctxt_pP, rlc_pP); // may be not necessary //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=10 (01)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); // one beginning segment of SDU in PDU rlc_am_send_sdu(ctxt_pP, rlc_pP); // may be not necessary rlc_am_reassembly (ctxt_pP, rlc_pP,pdu_info->payload, pdu_info->payload_size); //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=01 (10)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); // one last segment of SDU //if (rlc_pP->reassembly_missing_sn_detected == 0) { rlc_am_reassembly (ctxt_pP, rlc_pP, pdu_info->payload, pdu_info->payload_size); rlc_am_send_sdu(ctxt_pP, rlc_pP); //} // else { clear sdu already done //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU NO E_LI FI=00 (11)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); //if (rlc_pP->reassembly_missing_sn_detected == 0) { // one whole segment of SDU in PDU rlc_am_reassembly (ctxt_pP, rlc_pP, pdu_info->payload, pdu_info->payload_size); //} else { // rlc_pP->reassembly_missing_sn_detected = 1; // not necessary but for readability of the code //} break; #if USER_MODE default: assert(0 != 0); #endif } } else { switch (pdu_info->fi) { case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU FI=11 (00) Li=", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); // N complete SDUs rlc_am_send_sdu(ctxt_pP, rlc_pP); j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->li_list[i]); rlc_am_send_sdu(ctxt_pP, rlc_pP); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->hidden_size); rlc_am_send_sdu(ctxt_pP, rlc_pP); } //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU FI=10 (01) Li=", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); // N complete SDUs + one segment of SDU in PDU rlc_am_send_sdu(ctxt_pP, rlc_pP); j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->li_list[i]); rlc_am_send_sdu(ctxt_pP, rlc_pP); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->hidden_size); } //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU FI=01 (10) Li=", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); // one last segment of SDU + N complete SDUs in PDU j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->li_list[i]); rlc_am_send_sdu(ctxt_pP, rlc_pP); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->hidden_size); rlc_am_send_sdu(ctxt_pP, rlc_pP); } //rlc_pP->reassembly_missing_sn_detected = 0; break; case RLC_FI_1ST_BYTE_DATA_IS_NOT_1ST_BYTE_SDU_LAST_BYTE_DATA_IS_NOT_LAST_BYTE_SDU: LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU FI=00 (11) Li=", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); for (i=0; i < pdu_info->num_li; i++) { LOG_D(RLC, "%d ",pdu_info->li_list[i]); } LOG_D(RLC, "\n"); //msg(" remaining size %d\n",size); j = 0; for (i = 0; i < pdu_info->num_li; i++) { rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->li_list[i]); rlc_am_send_sdu(ctxt_pP, rlc_pP); j = j + pdu_info->li_list[i]; } if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->hidden_size); } else { #if USER_MODE //assert (5!=5); #endif } //rlc_pP->reassembly_missing_sn_detected = 0; break; #if USER_MODE default: assert(1 != 1); #endif } } free_mem_block(tb_pP); }