From 26ce3333d81e97dc46a8ef7bdb2db439718a295f Mon Sep 17 00:00:00 2001 From: Navid Nikaein <navid.nikaein@eurecom.fr> Date: Thu, 28 Aug 2014 17:30:05 +0000 Subject: [PATCH] * fix issues foe multi UE scenarios in MAC * add target MCS for DL and UL for LTE softmodem * make RLC message print for ITTI an option git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5762 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 6 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 218 +++++++++--------- openair2/LAYER2/MAC/pre_processor.c | 15 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c | 9 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 6 +- openair2/LAYER2/RLC/rlc.c | 8 +- openair2/UTIL/MEM/mem_block.h | 6 +- openair2/UTIL/OTG/otg_kpi.c | 4 +- openair2/UTIL/OTG/otg_tx.c | 4 +- targets/RT/USER/lte-softmodem.c | 17 +- .../SIMU/EXAMPLES/OSD/WEBXML/template_26.xml | 8 +- .../SIMU/EXAMPLES/OSD/WEBXML/template_27.xml | 90 ++++++++ targets/SIMU/USER/Makefile | 1 + targets/SIMU/USER/oaisim_functions.c | 10 +- targets/TEST/OAI/case01.py | 4 +- 15 files changed, 265 insertions(+), 141 deletions(-) create mode 100644 targets/SIMU/EXAMPLES/OSD/WEBXML/template_27.xml diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index f5a488634b..6008880982 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -506,11 +506,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, #ifdef USER_MODE // need to be adapted for the emulation in the kernel space if (uniformrandom() < bler) { - LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(0); + LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM); + return(1); } else { - LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM); return(1); } #endif diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index ff6a6d0b51..fcbc6d8930 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -418,21 +418,19 @@ void schedule_ue_spec(module_id_t module_idP, sdu_length_total=0; num_sdus=0; - if (openair_daq_vars.target_ue_dl_mcs <= 0) { - /* + /* DevCheck(((eNB_UE_stats->DL_cqi[0] < MIN_CQI_VALUE) || (eNB_UE_stats->DL_cqi[0] > MAX_CQI_VALUE)), - eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); + eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); */ - eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - LOG_T(MAC,"CQI %d\n",eNB_UE_stats->DL_cqi[0]); - } - else - eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; + eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; + eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); + #ifdef EXMIMO if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); #endif + // store stats UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0]; // initializing the rb allocation indicator for each UE @@ -637,79 +635,84 @@ void schedule_ue_spec(module_id_t module_idP, header_len_dcch = 2; // 2 bytes DCCH SDU subheader - - rlc_status = mac_rlc_status_ind( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH, - (TBS-ta_len-header_len_dcch)); // transport block set size - - sdu_lengths[0]=0; - if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit - LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",module_idP,frameP,TBS-header_len_dcch); - sdu_lengths[0] += mac_rlc_data_req( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH, - (char *)&dlsch_buffer[sdu_lengths[0]]); + if ( TBS-ta_len-header_len_dcch > 0 ) + { + rlc_status = mac_rlc_status_ind( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH, + (TBS-ta_len-header_len_dcch)); // transport block set size - LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",module_idP,sdu_lengths[0]); - sdu_length_total = sdu_lengths[0]; - sdu_lcids[0] = DCCH; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH]+=sdu_lengths[0]; - num_sdus = 1; + sdu_lengths[0]=0; + if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit + LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",module_idP,frameP,TBS-header_len_dcch); + sdu_lengths[0] += mac_rlc_data_req( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH, + (char *)&dlsch_buffer[sdu_lengths[0]]); + + LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",module_idP,sdu_lengths[0]); + sdu_length_total = sdu_lengths[0]; + sdu_lcids[0] = DCCH; + UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH]+=1; + UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH]+=sdu_lengths[0]; + num_sdus = 1; #ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC,"[eNB %d][DCCH] Got %d bytes :",module_idP,sdu_lengths[0]); - for (j=0;j<sdu_lengths[0];j++) - LOG_T(MAC,"%x ",dlsch_buffer[j]); - LOG_T(MAC,"\n"); + LOG_T(MAC,"[eNB %d][DCCH] Got %d bytes :",module_idP,sdu_lengths[0]); + for (j=0;j<sdu_lengths[0];j++) + LOG_T(MAC,"%x ",dlsch_buffer[j]); + LOG_T(MAC,"\n"); #endif + } + else { + header_len_dcch = 0; + sdu_length_total = 0; + } } - else { - header_len_dcch = 0; - sdu_length_total = 0; - } - // check for DCCH1 and update header information (assume 2 byte sub-header) - rlc_status = mac_rlc_status_ind( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH+1, - (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and - // DCCH SDU - - if (rlc_status.bytes_in_buffer > 0) { - LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n", - module_idP,frameP,TBS-header_len_dcch-sdu_length_total); - sdu_lengths[num_sdus] += mac_rlc_data_req( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH+1, - (char *)&dlsch_buffer[sdu_lengths[0]]); + if (TBS-ta_len-header_len_dcch-sdu_length_total > 0 ) + { + rlc_status = mac_rlc_status_ind( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH+1, + (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and + // DCCH SDU + + if (rlc_status.bytes_in_buffer > 0) + { + LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n", + module_idP,frameP,TBS-header_len_dcch-sdu_length_total); + sdu_lengths[num_sdus] += mac_rlc_data_req( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH+1, + (char *)&dlsch_buffer[sdu_lengths[0]]); - sdu_lcids[num_sdus] = DCCH1; - sdu_length_total += sdu_lengths[num_sdus]; - header_len_dcch += 2; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; - num_sdus++; - LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",module_idP,sdu_lengths[0]); + sdu_lcids[num_sdus] = DCCH1; + sdu_length_total += sdu_lengths[num_sdus]; + header_len_dcch += 2; + UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1; + UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; + num_sdus++; + LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",module_idP,sdu_lengths[0]); + } } - // check for DTCH and update header information - // here we should loop over all possible DTCH + // check for DTCH and update header information + // here we should loop over all possible DTCH header_len_dtch = 3; // 3 bytes DTCH SDU subheader @@ -717,40 +720,43 @@ void schedule_ue_spec(module_id_t module_idP, module_idP,frameP,DTCH,TBS, TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - rlc_status = mac_rlc_status_ind( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (rlc_status.bytes_in_buffer > 0) { - - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n", - module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); - sdu_lengths[num_sdus] = mac_rlc_data_req( - module_idP, - UE_id, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - (char*)&dlsch_buffer[sdu_length_total]); + if (TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch > 0 ) + { + rlc_status = mac_rlc_status_ind( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DTCH, + TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],DTCH); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; - if (sdu_lengths[num_sdus] < 128) { - header_len_dtch=2; + if (rlc_status.bytes_in_buffer > 0) { + + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n", + module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); + sdu_lengths[num_sdus] = mac_rlc_data_req( + module_idP, + UE_id, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DTCH, + (char*)&dlsch_buffer[sdu_length_total]); + + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],DTCH); + sdu_lcids[num_sdus] = DTCH; + sdu_length_total += sdu_lengths[num_sdus]; + UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1; + UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) { + header_len_dtch=2; + } + num_sdus++; + } + else { + header_len_dtch = 0; } - num_sdus++; - } - else { - header_len_dtch = 0; } // there is a payload diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index c0e7343d4a..fb68a34dc8 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -168,6 +168,8 @@ void assign_rbs_required (module_id_t Mod_id, eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); */ eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]]; + eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); + } // provide the list of CCs sorted according to MCS for (i=0;i<UE_list->numactiveCCs[UE_id];i++) { @@ -194,13 +196,16 @@ void assign_rbs_required (module_id_t Mod_id, LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); for (i=0;i<UE_list->numactiveCCs[UE_id];i++) { CC_id = UE_list->ordered_CCids[i][UE_id]; - LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); + if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small else nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); + + LOG_D(MAC,"[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", + UE_id, CC_id, UE_list->UE_template[pCCid][UE_id].dl_buffer_total, + nb_rbs_required[CC_id][UE_id],eNB_UE_stats[CC_id]->dlsch_mcs1,TBS); /* calculating required number of RBs for each UE */ - while (TBS < UE_list->UE_template[UE_id]->dl_buffer_total) { + while (TBS < UE_list->UE_template[pCCid][UE_id].dl_buffer_total) { nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; if (nb_rbs_required[CC_id][UE_id] > frame_parms[CC_id]->N_RB_DL) { TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,frame_parms[CC_id]->N_RB_DL); @@ -209,8 +214,8 @@ void assign_rbs_required (module_id_t Mod_id, } TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); } // end of while - LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d nb_required RB %d (TBS %d, mcs %d)\n", - Mod_id, frameP,UE_id, CC_id, nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); + LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", + Mod_id, frameP,UE_id, CC_id, min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); } } } 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 bd7dca0620..347353b29a 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -48,7 +48,8 @@ #include "rlc_um_very_simple_test.h" #define DEBUG_RLC_UM_TX_STATUS 1 -#define TRACE_RLC_UM_PDU 1 +// NN --> LG: this could become a perf bottleneck, I added this to the makefile. +//#define TRACE_RLC_UM_PDU 1 #ifdef TRACE_RLC_UM_PDU char message_string[10000]; @@ -663,7 +664,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) rlc_p->stat_tx_pdcp_sdu += 1; rlc_p->stat_tx_pdcp_bytes += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; -# if defined(ENABLE_ITTI) +# if defined(TRACE_RLC_UM_PDU) data_offset = sizeof (struct rlc_um_data_req_alloc); data_size = ((struct rlc_um_tx_sdu_management *)(sdu_pP->data))->sdu_size; message_string_size += sprintf(&message_string[message_string_size], "Bearer : %u\n", rlc_p->rb_id); @@ -696,6 +697,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) } message_string_size += sprintf(&message_string[message_string_size], " |\n"); +# if defined(ENABLE_ITTI) msg_p = itti_alloc_new_message_sized (rlc_p->is_enb > 0 ? TASK_RLC_ENB:TASK_RLC_UE , RLC_UM_SDU_REQ, message_string_size + sizeof (IttiMsgText)); msg_p->ittiMsg.rlc_um_sdu_req.size = message_string_size; memcpy(&msg_p->ittiMsg.rlc_um_sdu_req.text, message_string, message_string_size); @@ -705,6 +707,9 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) } else { itti_send_msg_to_task(TASK_UNKNOWN, rlc_p->ue_module_id + NB_eNB_INST, msg_p); } +#else + LOG_T(RLC, "%s", message_string); +#endif # endif } else { 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 fca9bc1c0c..7669756a6a 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 @@ -262,8 +262,12 @@ 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 + rlc_pP->size_input_sdus_buffer =1024; +#else rlc_pP->size_input_sdus_buffer =128; - +#endif + 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 *)); } diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index e5c773d1c1..307fe7e37d 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see <http://www.gnu.org/licenses/>. + included in this distribution in the file called "COPYING". If not, + see <http://www.gnu.org/licenses/>. Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr @@ -510,7 +510,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP, ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); free_mem_block(sdu_pP); - LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); + //LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][%s %u]\n", frameP, (enb_flagP) ? "eNB" : "UE", @@ -524,7 +524,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP, ue_module_idP, (srb_flagP) ? "SRB" : "DRB", rb_idP); - LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT); + //LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT); rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p); //free_mem_block(new_sdu); diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h index ec28fb0323..0a4b928378 100755 --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -103,17 +103,17 @@ private_mem_block(void check_free_mem_block (mem_block_t * leP);) # define MEM_MNGT_MB4_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*16 // 1024 -# define MEM_MNGT_MB4_NB_BLOCKS 512 * MEM_SCALE +# define MEM_MNGT_MB4_NB_BLOCKS 1024 * MEM_SCALE # define MEM_MNGT_POOL_ID4 4 # define MEM_MNGT_MB5_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*32 // 2048 -# define MEM_MNGT_MB5_NB_BLOCKS 512 * MEM_SCALE // LG WAS 1024 +# define MEM_MNGT_MB5_NB_BLOCKS 1024 * MEM_SCALE // LG WAS 1024 # define MEM_MNGT_POOL_ID5 5 # define MEM_MNGT_MB6_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*64 // 4096 -# define MEM_MNGT_MB6_NB_BLOCKS 128 * MEM_SCALE // LG WAS 256 +# define MEM_MNGT_MB6_NB_BLOCKS 1024 * MEM_SCALE // LG WAS 256 # define MEM_MNGT_POOL_ID6 6 # define MEM_MNGT_MB7_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*128 diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index a1efded2a9..fe2a6b1c14 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -697,7 +697,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){ LOG_I(OTG,"[BACKGROUND] Total bytes(RX)= %d \n", rx_total_bytes_dl_background); LOG_I(OTG,"[BACKGROUND] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[BACKGROUND] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024)); - } + } if (tx_total_pkts_dl_multicast>0){ LOG_I(OTG,"[MULTICAST] Total packets(TX)= %d \n", tx_total_pkts_dl_multicast); LOG_I(OTG,"[MULTICAST] Total bytes(TX)= %d \n", tx_total_bytes_dl_multicast); @@ -706,7 +706,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){ LOG_I(OTG,"[MULTICAST] otg_multicast_info->ctime = %d \n", otg_multicast_info->ctime); LOG_I(OTG,"[MULTICAST] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[MULTICAST] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024)); - } + } LOG_F(OTG,"**************** TOTAL DL RESULTS ******************\n"); diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index a9024d3ab6..a5361ef9ca 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -262,7 +262,7 @@ Send Packets when: otg_info->size_background[src][dst]=g_otg->aggregation_level[src][dst][application]*otg_info->size_background[src][dst]; else{ //otg_info->size_background[src][dst]=PAYLOAD_MAX; - LOG_E(OTG,"[BACKGROUND] Aggregated packet larger than PAYLOAD_MAX, payload is limited to PAYLOAD_MAX %d\n"); + LOG_E(OTG,"[BACKGROUND] Aggregated packet larger than PAYLOAD_MAX, payload is limited to %d\n", PAYLOAD_MAX); } header =random_string(header_size_gen_background(src,dst), g_otg->packet_gen_type, HEADER_ALPHABET); payload = random_string(otg_info->size_background[src][dst], RANDOM_STRING, PAYLOAD_ALPHABET); @@ -466,7 +466,7 @@ int check_data_transmit(int src,int dst, int app, int ctime){ /* if the aggregated size is less than PAYLOAD_MAX the traffic is aggregated, otherwise size=PAYLOAD_MAX */ if (size>=(PAYLOAD_MAX-(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]))) { //size=PAYLOAD_MAX- (sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]); - LOG_E(OTG,"Aggregated packet larger than PAYLOAD_MAX, payload is limited to PAYLOAD_MAX \n"); + LOG_E(OTG,"Aggregated packet larger than PAYLOAD_MAX, payload is limited to %d \n", PAYLOAD_MAX ); } } //check if there is background traffic to generate diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 7e18d20417..37aa3b84f3 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -301,6 +301,10 @@ static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,7 static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; int multi_thread=1; +// this allows +uint32_t target_dl_mcs = 28; +uint32_t target_ul_mcs = 8; + int16_t glog_level=LOG_DEBUG; int16_t glog_verbosity=LOG_MED; @@ -1735,7 +1739,7 @@ static void get_options (int argc, char **argv) { {"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT}, {NULL, 0, NULL, 0}}; - while ((c = getopt_long (argc, argv, "C:dK:g:G:qO:SUVRMr:s:",long_options,NULL)) != -1) { + while ((c = getopt_long (argc, argv, "C:dK:g:G:qO:m:SUVRMr:s:t:",long_options,NULL)) != -1) { switch (c) { case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS: ULSCH_max_consecutive_errors = atoi(optarg); @@ -1805,6 +1809,13 @@ static void get_options (int argc, char **argv) { case 'U': UE_flag = 1; break; + + case 'm': + target_dl_mcs = atoi (optarg); + break; + case 't': + target_ul_mcs = atoi (optarg); + break; case 'V': ouput_vcd = 1; @@ -2240,9 +2251,9 @@ int main(int argc, char **argv) { NB_INST=1; openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.target_ue_dl_mcs=20; + openair_daq_vars.target_ue_dl_mcs=target_dl_mcs; openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.target_ue_ul_mcs=6; + openair_daq_vars.target_ue_ul_mcs=target_ul_mcs; } diff --git a/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml index b95e6a05cd..9198c1e3f6 100755 --- a/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml +++ b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml @@ -11,8 +11,8 @@ <TOPOLOGY_CONFIG> <AREA> - <X_m>500</X_m> - <Y_m>500</Y_m> + <X_m>1000</X_m> + <Y_m>1000</Y_m> </AREA> <MOBILITY> <UE_MOBILITY> @@ -77,8 +77,8 @@ <OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd --> </PERFORMANCE_METRICS> <LOG> <!-- set the global log level --> - <LEVEL>info</LEVEL> - <VERBOSITY>low</VERBOSITY> + <LEVEL>debug</LEVEL> + <VERBOSITY>medium</VERBOSITY> <INTERVAL>1</INTERVAL> </LOG> <SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI --> diff --git a/targets/SIMU/EXAMPLES/OSD/WEBXML/template_27.xml b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_27.xml new file mode 100644 index 0000000000..a54e9d2744 --- /dev/null +++ b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_27.xml @@ -0,0 +1,90 @@ +<OAI_EMULATION> + <ENVIRONMENT_SYSTEM_CONFIG> + <FADING> + <FREE_SPACE_MODEL_PARAMETERS> + <PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT> + </FREE_SPACE_MODEL_PARAMETERS> + <SMALL_SCALE>AWGN</SMALL_SCALE> + </FADING> + <SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz> + </ENVIRONMENT_SYSTEM_CONFIG> + + <TOPOLOGY_CONFIG> + <AREA> + <X_m>1000</X_m> + <Y_m>1000</Y_m> + </AREA> + <MOBILITY> + <UE_MOBILITY> + <RANDOM_UE_DISTRIBUTION> + <NUMBER_OF_NODES>1</NUMBER_OF_NODES> + </RANDOM_UE_DISTRIBUTION> + <UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC --> + </UE_MOBILITY> + <eNB_MOBILITY> + <eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION> + <RANDOM_eNB_DISTRIBUTION> + <NUMBER_OF_CELLS>1</NUMBER_OF_CELLS> + </RANDOM_eNB_DISTRIBUTION> + <eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE> + </eNB_MOBILITY> + </MOBILITY> + </TOPOLOGY_CONFIG> + + <APPLICATION_CONFIG> + <!-- Basic configuration of a customized traffic : one state--> + <CUSTOMIZED_TRAFFIC> + <SOURCE_ID>0</SOURCE_ID> + <TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp --> + <IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 --> + <DESTINATION_ID>1</DESTINATION_ID> + <FLOW_START_ms>1000</FLOW_START_ms> <!-- indicates the start time of the app or the actual duration of the traffic--> + <FLOW_DURATION_ms>10000</FLOW_DURATION_ms> <!-- indicates the start time of the app or the actual duration of the traffic--> + + <BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction--> + <IDT_DIST>fixed</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav--> + <IDT_MIN_ms>1</IDT_MIN_ms> <!--Minimum IDT values in milliseconds--> + <IDT_MAX_ms>1</IDT_MAX_ms> <!--Minimum IDT values in milliseconds--> + <SIZE_DIST>fixed</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav--> + <SIZE_MIN_byte>1000</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes--> + <SIZE_MAX_byte>2000</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes--> + </CUSTOMIZED_TRAFFIC> + + <CUSTOMIZED_TRAFFIC> + <SOURCE_ID>1</SOURCE_ID> + <TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp --> + <IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 --> + <DESTINATION_ID>0</DESTINATION_ID> + <FLOW_START_ms>1000</FLOW_START_ms> <!-- indicates the start time of the app or the actual duration of the traffic--> + <FLOW_DURATION_ms>10000</FLOW_DURATION_ms> <!-- indicates the start time of the app or the actual duration of the traffic--> + <BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction--> + <IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav--> + <IDT_MIN_ms>100</IDT_MIN_ms> <!--Minimum IDT values in milliseconds--> + <IDT_MAX_ms>150</IDT_MAX_ms> <!--Minimum IDT values in milliseconds--> + <SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav--> + <SIZE_MIN_byte>256</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes--> + <SIZE_MAX_byte>768</SIZE_MAX_byte> <!--Maximum PAYLOAD size values in bytes--> + </CUSTOMIZED_TRAFFIC> + + </APPLICATION_CONFIG> + + <EMULATION_CONFIG> + <EMULATION_TIME_ms>15000</EMULATION_TIME_ms> <!--if 0 set to infinity--> + <CURVE>disable</CURVE> <!-- option: enable, disable. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet --> + <PERFORMANCE_METRICS> + <THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time--> + <LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time--> + <OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd --> + </PERFORMANCE_METRICS> + <LOG> <!-- set the global log level --> + <LEVEL>debug</LEVEL> + <VERBOSITY>medium</VERBOSITY> + <INTERVAL>1</INTERVAL> + </LOG> + <SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI --> + + </EMULATION_CONFIG> + + <PROFILE>MEDIEVAL_OTG_1</PROFILE> +</OAI_EMULATION> + diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile index 3e141ef97c..3fcd8f6c84 100644 --- a/targets/SIMU/USER/Makefile +++ b/targets/SIMU/USER/Makefile @@ -19,6 +19,7 @@ linux = $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi) ifdef DEBUG CFLAGS += -g -ggdb -DDEBUG_PHY -DDEBUG_MEAS +CFLAGS += -DTRACE_RLC_UM_PDU else CFLAGE += -O2 endif diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 888425da78..24e1eefbf6 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -91,7 +91,7 @@ int for_times = 0; static char *conf_config_file_name = NULL; uint16_t Nid_cell = 0; //needed by init_lte_vars int nb_antennas_rx = 2; // // -uint8_t target_dl_mcs = 0; // not set +uint8_t target_dl_mcs = 16; // max mcs used by MAC scheduler uint8_t rate_adaptation_flag = 0; uint8_t set_sinr = 0; double snr_dB=0, sinr_dB=0; @@ -468,6 +468,7 @@ void get_simulation_options(int argc, char *argv[]) { case 'm': target_dl_mcs = atoi (optarg); + printf("Max target downlink MCS used by MAC scheduler is set to %d\n", target_dl_mcs); break; case 'M': @@ -559,7 +560,8 @@ void get_simulation_options(int argc, char *argv[]) { case 't': target_ul_mcs = atoi (optarg); - break; + printf("Max target uplink MCS used by MAC scheduler is set to %d\n", target_ul_mcs); + break; case 'T': oai_emulation.info.otg_enabled = 1; @@ -840,8 +842,8 @@ void init_openair1(void) { openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; - - openair_daq_vars.target_ue_dl_mcs = target_dl_mcs; +#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than" + openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; openair_daq_vars.ue_dl_rb_alloc=0x1fff; openair_daq_vars.ue_ul_nb_rb=6; diff --git a/targets/TEST/OAI/case01.py b/targets/TEST/OAI/case01.py index b89b911ba1..dec0499e27 100644 --- a/targets/TEST/OAI/case01.py +++ b/targets/TEST/OAI/case01.py @@ -77,7 +77,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug): oai.send('make cleanall;') oai.send('make cleanasn1;') oai.send('rm -f ./oaisim.rel8.'+host) - oai.send_expect_false('make -j4' + tee, makerr1, 1500) + oai.send_expect_false('make -j4 JF=1' + tee, makerr1, 1500) oai.send('cp ./oaisim ./oaisim.rel8.'+host) except log.err, e: log.fail(case, test, name, conf, e.value, diag, logfile,trace) @@ -99,7 +99,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug): oai.send_expect_false('make nasmesh_fix' + tee, makerr1, 60) trace = logdir + '/log_' + case + test + '_2.txt;' tee = ' 2>&1 | tee ' + trace - oai.send_expect_false('make NAS=1 -j4' + tee, makerr1, 1500) + oai.send_expect_false('make NAS=1 JF=1 -j4' + tee, makerr1, 1500) oai.send('cp ./oaisim ./oaisim.rel8.nas.'+host) except log.err, e: -- GitLab