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