diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c
index 07c8c12c39bfc754339b3b34a7be66a9c118b814..3438ca1f1c2b76a69dc8e1efe186fb0d091c8062 100644
--- a/openair1/PHY/TOOLS/time_meas.c
+++ b/openair1/PHY/TOOLS/time_meas.c
@@ -44,6 +44,35 @@ int opp_enabled = 0;
   return (double)ts.diff/1000000000;
   }*/
 
+double get_cpu_freq_GHz(void) {
+
+  time_stats_t ts = {0};
+  reset_meas(&ts);
+  start_meas(&ts);
+  sleep(1);
+  stop_meas(&ts);
+  cpu_freq_GHz = (double)ts.diff/1000000000;
+  return cpu_freq_GHz; 
+}
+
+void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name){
+
+  if (opp_enabled) {
+
+    //static double cpu_freq_GHz = 3.2;
+
+    //if (cpu_freq_GHz == 0.0)
+      //cpu_freq_GHz = get_cpu_freq_GHz(); // super slow
+
+    if (ts->trials>0) {
+
+      //fprintf(file_name,"Name %25s: Processing %15.3f ms for SF %d, diff_now %15.3f \n", name,(ts->diff_now/(cpu_freq_GHz*1000000.0)),subframe,ts->diff_now);
+      fprintf(file_name,"%15.3f ms, diff_now %15.3f \n",(ts->diff_now/(cpu_freq_GHz*1000000.0)),ts->diff_now);
+      
+    }
+  }
+}
+
 void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time)
 {
 
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index f60f591f07b9dcd5bf74a3fa02ea2f549bc498ae..67c0f32f4394482c00322081331357bbebdfb675 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -34,9 +34,12 @@
 // global var to enable openair performance profiler
 extern int opp_enabled;
 
+double cpu_freq_GHz;
+
 typedef struct {
 
   long long in;
+  long long diff_now;
   long long diff;
   long long p_time; /*!< \brief absolute process duration */
   long long diff_square; /*!< \brief process duration square */
@@ -47,8 +50,11 @@ typedef struct {
 static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
 static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
 
+
+void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name);
 void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
 double get_time_meas_us(time_stats_t *ts);
+double get_cpu_freq_GHz(void);
 
 #if defined(__i386__)
 static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
@@ -109,6 +115,8 @@ static inline void stop_meas(time_stats_t *ts)
     if (tid==0)
 #endif
     {
+      ts->diff_now = (out-ts->in);
+      
       ts->diff += (out-ts->in);
       /// process duration is the difference between two clock points
       ts->p_time = (out-ts->in);
@@ -121,16 +129,25 @@ static inline void stop_meas(time_stats_t *ts)
   }
 }
 
-static inline void reset_meas(time_stats_t *ts)
-{
+static inline void reset_meas(time_stats_t *ts) {
 
+  static cpu_freq_set=0;
+  
   if (opp_enabled) {
     ts->trials=0;
+    ts->diff_now=0;
     ts->diff=0;
     ts->p_time=0;
     ts->diff_square=0;
     ts->max=0;
+
+    if (cpu_freq_set == 0 ){
+      cpu_freq_set = 1;
+      get_cpu_freq_GHz();
+      printf("CPU Freq is %f \n", cpu_freq_GHz);
+    } 
   }
+  
 }
 static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
 {
@@ -148,14 +165,4 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
 
   }
 */
-static inline double get_cpu_freq_GHz(void)
-{
-
-  time_stats_t ts = {0};
-  reset_meas(&ts);
-  start_meas(&ts);
-  sleep(1);
-  stop_meas(&ts);
-  return (double)ts.diff/1000000000;
-}
 
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index b3cf48c5a6f29087a07bff3b0185fa4d891c9acf..bceb678933b5c3085cab19177cbf7c807396865b 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1394,7 +1394,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
     // If we've dropped the UE, go back to PRACH mode for this UE
     //#if !defined(EXMIMO_IOT)
     if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
-      LOG_I(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
+      LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
             phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
       phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
       remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
@@ -3549,7 +3549,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
      */
           //    dump_ulsch(phy_vars_eNB,sched_subframe,i);
           //#ifndef EXMIMO_IOT
-          LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
+          LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i);
           //#else
           //mac_exit_wrapper("Msg3 error");
           //#endif
diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c
index 6e4aa838082f9ab066e43d9a3191c2850a7c0f6d..0d7a99b8d25d8000afea013aafcbd8262b27d0ae 100644
--- a/openair1/SCHED/pusch_pc.c
+++ b/openair1/SCHED/pusch_pc.c
@@ -81,7 +81,8 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,
   //(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->control_only == 1) ? phy_vars_eNB->ulsch_eNB[UE_id]->beta_offset_cqi_times8:8;
 
   DevAssert( UE_id < NUMBER_OF_UE_MAX );
-  DevAssert( MPR_x100/6 < 100 );
+#warning "This condition happens sometimes. Need more investigation" // navid
+  //DevAssert( MPR_x100/6 < 100 );
 
   if (phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) {
     // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index a70a7eae9bc32e1126097743fbf870bf168bf9ca..0a2ec290d72796e8d0c5fa5101f07a5c640f80e1 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -766,16 +766,15 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 
             ndi = 1-UE_template->oldNDI_UL[harq_pid];
             UE_template->oldNDI_UL[harq_pid]=ndi;
-            //mcs = 10;
-            UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=UE_template->pre_assigned_mcs_ul;
+	    UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=UE_template->pre_assigned_mcs_ul;
             mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
 
             if (UE_template->pre_allocated_rb_table_index_ul >=0) {
               rb_table_index=UE_template->pre_allocated_rb_table_index_ul;
             } else {
-              mcs=10;
+	      mcs=cmin (10, openair_daq_vars.target_ue_ul_mcs);
               rb_table_index=5; // for PHR
-            }
+	    }
 
             UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs;
             buffer_occupancy = UE_template->ul_total_buffer;
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index 50cf675366b7bd53e0aba457c165c2d97fedd98a..8e46ac1db60ccbcba67e151ab54171c3dd38b204 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -1057,11 +1057,11 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra
       // if this UE has UL traffic
       if (UE_template->ul_total_buffer > 0 ) {
 
-        tbs = mac_xface->get_TBS_UL(mcs,1);
+        tbs = mac_xface->get_TBS_UL(mcs,3);  // 1 or 2 PRB with cqi enabled does not work well!
         // fixme: set use_srs flag
         tx_power= mac_xface->estimate_ue_tx_power(tbs,rb_table[rb_table_index],0,frame_parms->Ncp,0);
 
-        while (((UE_template->phr_info - tx_power) < 0 )  &&
+        while ((((UE_template->phr_info - tx_power) < 0 ) || (tbs > UE_template->ul_total_buffer))&&
                (mcs > 3)) {
           // LOG_I(MAC,"UE_template->phr_info %d tx_power %d mcs %d\n", UE_template->phr_info,tx_power, mcs);
           mcs--;
@@ -1086,7 +1086,7 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra
         }
 
         // 1 or 2 PRB with cqi enabled does not work well!
-        if (rb_table[rb_table_index]<3) {
+	if (rb_table[rb_table_index]<3) {
           rb_table_index=2; //3PRB
         }
 
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 1ab7bef405cc1edcd1e9a7214c14ea021c1e8e47..328548da47cc67a2fba671db4a12067d947e0646 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -83,6 +83,7 @@ const char* eurecomVariablesNames[] = {
   "slot_number_RX_UE",
   "subframe_number_TX_UE",
   "subframe_number_RX_UE",
+  "missed_slot_enb",
   "daq_mbox",
   "rx_offset_mbox",
   "ue_rx_offset",
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index 93e66ebfd5be1eabc153dd28a4b9b3337cef7246..13e9250d688db045e52881c9553d54bd363f984e 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -55,6 +55,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX_UE,
   VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE,
   VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE,
+  VCD_SIGNAL_DUMPER_VARIABLES_MISSED_SLOTS_ENB,
   VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET,
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
index 90b131c040dd10e104020302136dcca953652a41..dec6231aaa242cd389682d6840c955f423e8da10 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
@@ -30,10 +30,10 @@ eNBs =
                            tdd_config_s            			      = 0;
  			   prefix_type             			      = "NORMAL";
   			   eutra_band              			      = 7;
-                           downlink_frequency      			      = 2660000000L;
+                           downlink_frequency      			      = 2680000000L;
                            uplink_frequency_offset 			      = -120000000;
   			   Nid_cell					      = 0;
-                           N_RB_DL                 			      = 25;
+                           N_RB_DL                 			      = 50;
                            Nid_cell_mbsfn          			      = 0;
                            nb_antennas_tx          			      = 1;
                            nb_antennas_rx          			      = 1; 
@@ -66,9 +66,9 @@ eNBs =
 	                   srs_ackNackST                                      =;
 	                   srs_MaxUpPts                                       =;*/  
 
-	                   pusch_p0_Nominal                                   = -85; 
+	                   pusch_p0_Nominal                                   = -80; /*-85;*/ 
 	                   pusch_alpha                                        = "AL1";
-	                   pucch_p0_Nominal                                   = -108;
+	                   pucch_p0_Nominal                                   = -108; /* -108 */
 	                   msg3_delta_Preamble                                = 6;
 	                   pucch_deltaF_Format1                               = "deltaF2";
 	                   pucch_deltaF_Format1b                              = "deltaF3";
@@ -104,7 +104,7 @@ eNBs =
 			 );
     
     ////////// MME parameters:
-    mme_ip_address      = ( { ipv4       = "192.168.13.11";
+    mme_ip_address      = ( { ipv4       = "10.0.1.1";
                               ipv6       = "192:168:30::17";
                               active     = "yes";
                               preference = "ipv4";
@@ -113,11 +113,11 @@ eNBs =
 
     NETWORK_INTERFACES : 
     {
-        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.10/24";
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth3";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "10.0.1.229/24";
 
-        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.10/24";
+        ENB_INTERFACE_NAME_FOR_S1U               = "eth3";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "10.0.1.229/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
     
@@ -125,7 +125,7 @@ eNBs =
     {
 	global_log_level                      ="debug"; 
     	global_log_verbosity                  ="medium";
-	hw_log_level                          ="warn"; 
+	hw_log_level                          ="info"; 
     	hw_log_verbosity                      ="medium";
 	phy_log_level                         ="warn"; 
     	phy_log_verbosity                     ="medium";
@@ -137,6 +137,12 @@ eNBs =
     	pdcp_log_verbosity                    ="medium";
 	rrc_log_level                         ="info"; 
     	rrc_log_verbosity                     ="medium";
+	gtpu_log_level                         ="error"; 
+    	gtpu_log_verbosity                     ="medium";
+	udp_log_level                         ="error"; 
+    	udp_log_verbosity                     ="medium";
+	osa_log_level                         ="warn"; 
+    	osa_log_verbosity                     ="low";
    };	
    
   }
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e651a2c07daecb0ff392fcbd426acac2f585c134
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf
@@ -0,0 +1,149 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    # real_time choice in {hard, rt-preempt, no}
+    real_time       =  "no";
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+    
+    cell_type =  "CELL_MACRO_ENB";
+    
+    eNB_name  =  "eNB_Eurecom_LTEBox";
+    
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  "1";
+    
+    mobile_country_code =  "001";
+    
+    mobile_network_code =  "01";
+    
+       ////////// Physical parameters:
+  
+    component_carriers = (
+    		       	 {
+  			   frame_type					      = "FDD";	
+                           tdd_config 					      = 3;
+                           tdd_config_s            			      = 0;
+ 			   prefix_type             			      = "NORMAL";
+  			   eutra_band              			      = 7;
+                           downlink_frequency      			      = 2680000000L;
+                           uplink_frequency_offset 			      = -120000000;
+  			   Nid_cell					      = 0;
+                           N_RB_DL                 			      = 25;
+                           Nid_cell_mbsfn          			      = 0;
+                           nb_antennas_tx          			      = 1;
+                           nb_antennas_rx          			      = 1; 
+			   tx_gain                                            = 25;
+			   rx_gain                                            = 20;
+                           prach_root              			      = 0;
+                           prach_config_index      			      = 0;
+                           prach_high_speed        			      = "DISABLE";
+  	                   prach_zero_correlation  			      = 1;
+                           prach_freq_offset       			      = 2;
+			   pucch_delta_shift       			      = 1;
+                           pucch_nRB_CQI           			      = 1;
+                           pucch_nCS_AN            			      = 0;
+                           pucch_n1_AN             			      = 32;
+                           pdsch_referenceSignalPower 			      = -26;
+                           pdsch_p_b                  			      = 0;
+                           pusch_n_SB                 			      = 1; 
+                           pusch_enable64QAM          			      = "DISABLE";
+			   pusch_hoppingMode                                  = "interSubFrame";
+			   pusch_hoppingOffset                                = 0;
+     	                   pusch_groupHoppingEnabled  			      = "ENABLE";
+	                   pusch_groupAssignment      			      = 0;
+	                   pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+	                   pusch_nDMRS1                                       = 0;
+	                   phich_duration                                     = "NORMAL";
+	                   phich_resource                                     = "ONESIXTH";
+	                   srs_enable                                         = "DISABLE";
+	               /*  srs_BandwidthConfig                                =;
+	                   srs_SubframeConfig                                 =;
+	                   srs_ackNackST                                      =;
+	                   srs_MaxUpPts                                       =;*/  
+
+	                   pusch_p0_Nominal                                   = -80; /*-85;*/ 
+	                   pusch_alpha                                        = "AL1";
+	                   pucch_p0_Nominal                                   = -108; /* -108 */
+	                   msg3_delta_Preamble                                = 6;
+	                   pucch_deltaF_Format1                               = "deltaF2";
+	                   pucch_deltaF_Format1b                              = "deltaF3";
+	                   pucch_deltaF_Format2                               = "deltaF0";
+	                   pucch_deltaF_Format2a                              = "deltaF0";
+  	                   pucch_deltaF_Format2b		    	      = "deltaF0";
+	
+                           rach_numberOfRA_Preambles                          = 64;
+                           rach_preamblesGroupAConfig                         = "DISABLE";
+/*
+                           rach_sizeOfRA_PreamblesGroupA                      = ;
+                           rach_messageSizeGroupA                             = ;
+                           rach_messagePowerOffsetGroupB                      = ; 
+*/
+                           rach_powerRampingStep                              = 2;
+	                   rach_preambleInitialReceivedTargetPower            = -100;
+                           rach_preambleTransMax                              = 10;
+	                   rach_raResponseWindowSize                          = 10;
+	                   rach_macContentionResolutionTimer                  = 48;
+	                   rach_maxHARQ_Msg3Tx                                = 4;
+
+			   pcch_default_PagingCycle                           = 128;
+			   pcch_nB                                            = "oneT";
+			   bcch_modificationPeriodCoeff			      = 2;
+			   ue_TimersAndConstants_t300			      = 1000;
+			   ue_TimersAndConstants_t301			      = 1000;
+			   ue_TimersAndConstants_t310			      = 1000;
+			   ue_TimersAndConstants_t311			      = 10000;
+			   ue_TimersAndConstants_n310			      = 20;
+			   ue_TimersAndConstants_n311			      = 1;
+
+			 }
+			 );
+    
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "192.168.4.80";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    NETWORK_INTERFACES : 
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth3";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "10.0.1.10/24";
+
+        ENB_INTERFACE_NAME_FOR_S1U               = "eth3";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "10.0.1.10/24";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+    
+    log_config : 
+    {
+	global_log_level                      ="debug"; 
+    	global_log_verbosity                  ="medium";
+	hw_log_level                          ="info"; 
+    	hw_log_verbosity                      ="medium";
+	phy_log_level                         ="warn"; 
+    	phy_log_verbosity                     ="medium";
+	mac_log_level                         ="warn"; 
+    	mac_log_verbosity                     ="medium";
+	rlc_log_level                         ="warn"; 
+    	rlc_log_verbosity                     ="medium";
+	pdcp_log_level                        ="warn"; 
+    	pdcp_log_verbosity                    ="medium";
+	rrc_log_level                         ="info"; 
+    	rrc_log_verbosity                     ="medium";
+	gtpu_log_level                         ="info"; 
+    	gtpu_log_verbosity                     ="medium";
+	udp_log_level                         ="info"; 
+    	udp_log_verbosity                     ="medium";
+	osa_log_level                         ="warn"; 
+    	osa_log_verbosity                     ="low";
+   };	
+   
+  }
+);
diff --git a/targets/RT/USER/eNB_exmimo2.gtkw b/targets/RT/USER/eNB_exmimo2.gtkw
index b14d9ac505f5164c450496bfaeb777693d5ddf82..ac682a2e83edd320a05ac7445af004326ee9458e 100644
--- a/targets/RT/USER/eNB_exmimo2.gtkw
+++ b/targets/RT/USER/eNB_exmimo2.gtkw
@@ -1,15 +1,15 @@
 [*]
-[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
-[*] Fri Feb 27 11:14:11 2015
+[*] GTKWave Analyzer v3.3.62 (w)1999-2014 BSI
+[*] Thu May 28 09:51:04 2015
 [*]
-[dumpfile] "/tmp/openair_dump_eNB.vcd"
-[dumpfile_mtime] "Fri Feb 27 11:06:12 2015"
-[dumpfile_size] 22907981
-[savefile] "/home/superserver/openair4G/trunk/targets/RT/USER/eNB_exmimo2.gtkw"
-[timestart] 26966900000
-[size] 1158 892
-[pos] -1 -1
-*-23.248880 26982603536 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[dumpfile] "/home/geyser/Documents/Results-Mobiarch-v2/no-dedicated-core/FIFO/2 cores/50RB/MCS26-16/run4-ok/openair_dump_eNB.vcd"
+[dumpfile_mtime] "Fri May 22 17:35:07 2015"
+[dumpfile_size] 352707646
+[savefile] "/home/geyser/openair4G/targets/RT/USER/eNB_exmimo2.gtkw"
+[timestart] 48949410000
+[size] 1920 1014
+[pos] -40 -40
+*-21.787668 54509118463 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [sst_width] 257
 [signals_width] 230
 [sst_expanded] 1
@@ -17,6 +17,14 @@
 @24
 variables.hw_frame[63:0]
 variables.hw_subframe[63:0]
+@28
+functions.rt_sleep
+@22
+variables.daq_mbox[63:0]
+variables.diff2[63:0]
+@25
+variables.missed_slot_enb[63:0]
+@24
 variables.txcnt[63:0]
 variables.rxcnt[63:0]
 variables.frame_number_TX_eNB[63:0]
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index a9b63c72caabaeae7db0c8fa1ff4a75c484f4dcb..f88a9b598ff6d0262bed31c4c754d293ac5a9b12 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -53,6 +53,7 @@
 #include <execinfo.h>
 #include <getopt.h>
 #include <syscall.h>
+#include <pthread.h>  //  for gettid
 
 #include "rt_wrapper.h"
 #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
@@ -960,7 +961,12 @@ static void* eNB_thread_tx( void* param )
   static int eNB_thread_tx_status[NUM_ENB_THREADS];
 
   eNB_proc_t *proc = (eNB_proc_t*)param;
-
+  FILE  *tx_time_file;
+  char tx_time_name[101];
+  if (opp_enabled == 1) {
+    snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe);
+    tx_time_file = fopen(tx_time_name,"w");
+  }
   // set default return value
   eNB_thread_tx_status[proc->subframe] = 0;
 
@@ -1002,9 +1008,9 @@ static void* eNB_thread_tx( void* param )
     return &eNB_thread_tx_status[proc->subframe];
   }
 
-  LOG_I( HW, "[SCHED] eNB TX deadline thread %d(id %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() );
+  LOG_I( HW, "[SCHED] eNB TX deadline thread %d(tid %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() );
 #else
-  LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d\n", proc->subframe, sched_getcpu() );
+  LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %d\n", proc->subframe, sched_getcpu(),gettid() );
 #endif
 
 #endif
@@ -1076,6 +1082,9 @@ static void* eNB_thread_tx( void* param )
     if (proc->frame_tx==1024)
       proc->frame_tx=0;
 
+    stop_meas( &softmodem_stats_tx_sf[proc->subframe] );
+    print_meas_now(&softmodem_stats_tx_sf[proc->subframe],"eNB_TX_SF",proc->subframe, tx_time_file);
+
   }
 
   stop_meas( &softmodem_stats_tx_sf[proc->subframe] );
@@ -1110,6 +1119,12 @@ static void* eNB_thread_rx( void* param )
 
   eNB_proc_t *proc = (eNB_proc_t*)param;
 
+  FILE  *rx_time_file;
+  char rx_time_name[101];
+  if (opp_enabled == 1){
+    snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->subframe);
+    rx_time_file = fopen(rx_time_name,"w");
+  }
   // set default return value
   eNB_thread_rx_status[proc->subframe] = 0;
 
@@ -1143,7 +1158,7 @@ static void* eNB_thread_rx( void* param )
   /* This creates a 2ms reservation every 10ms period*/
   attr.sched_policy = SCHED_DEADLINE;
   attr.sched_runtime  = 0.9 *  1000000; // each rx thread must finish its job in the worst case in 2ms
-  attr.sched_deadline = 1   *  1000000; // each rx thread will finish within 2ms
+  attr.sched_deadline = 2   *  1000000; // each rx thread will finish within 2ms
   attr.sched_period   = 1   * 10000000; // each rx thread has a period of 10ms from the starting point
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
@@ -1153,7 +1168,7 @@ static void* eNB_thread_rx( void* param )
 
   LOG_I( HW, "[SCHED] eNB RX deadline thread %d(id %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() );
 #else
-  LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d\n", proc->subframe, sched_getcpu() );
+  LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %d\n", proc->subframe, sched_getcpu(),gettid() );
 #endif
 #endif // RTAI
 
@@ -1219,6 +1234,9 @@ static void* eNB_thread_rx( void* param )
     if (proc->frame_rx==1024)
       proc->frame_rx=0;
 
+    stop_meas( &softmodem_stats_rx_sf[proc->subframe] );
+    print_meas_now(&softmodem_stats_rx_sf[proc->subframe],"eNB_RX_SF",proc->subframe, rx_time_file);
+
   }
 
   stop_meas( &softmodem_stats_rx_sf[proc->subframe] );
@@ -1269,6 +1287,7 @@ void init_eNB_proc(void)
       sched_param_eNB_proc_rx[CC_id][i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
       pthread_attr_setschedparam  (&attr_eNB_proc_rx[CC_id][i], &sched_param_eNB_proc_rx[CC_id][i]);
       pthread_attr_setschedpolicy (&attr_eNB_proc_rx[CC_id][i], SCHED_FIFO);
+      printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i);
 #endif
 
       PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_tx = -1;
@@ -1429,7 +1448,7 @@ static void* eNB_thread( void* arg )
   unsigned int rx_pos = 0;
   unsigned int tx_pos = spp*tx_delay;
 #endif
-
+  int CC_id=0;	
   struct timespec trx_time0, trx_time1, trx_time2;
 
 #ifdef RTAI
@@ -1475,7 +1494,7 @@ static void* eNB_thread( void* arg )
 #ifdef RTAI
   printf( "[SCHED][eNB] Started eNB main thread (id %p)\n", task );
 #else
-  printf( "[SCHED][eNB] Started eNB main thread on CPU %d\n", sched_getcpu());
+  printf( "[SCHED][eNB] Started eNB main thread on CPU %d TID %d\n", sched_getcpu(), gettid());
 #endif
 
 #ifdef HARD_RT
@@ -1533,18 +1552,40 @@ static void* eNB_thread( void* arg )
     }
 
     if (((slot%2==0) && (diff < (-14))) || ((slot%2==1) && (diff < (-7)))) {
-      // at the eNB, even slots have double as much time since most of the processing is done here and almost nothing in odd slots
-      LOG_D(HW,"eNB Frame %d, time %llu: missed slot, proceeding with next one (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current,
-            mbox_target, diff);
-      slot++;
 
+      // at the eNB, even slots have double as much time since most of the processing is done here and almost nothing in odd slots
+      LOG_W(HW,"eNB Frame %d, time %llu: missed slot %d, proceeding with next one (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",
+	    frame, rt_get_time_ns(), num_missed_slots, slot, hw_slot, mbox_current,mbox_target, diff);
+      
       if (exit_missed_slots==1) {
         stop_meas(&softmodem_stats_mt);
         exit_fun("[HW][eNB] missed slot");
       } else {
         num_missed_slots++;
-        LOG_W(HW,"[eNB] just missed slot (total missed slots %ld)\n", num_missed_slots);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_MISSED_SLOTS_ENB,num_missed_slots );
       }
+
+      if ((slot&1) == 1) {
+	for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){
+	  if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx==1023)
+	    PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx=0;
+	  else 
+	    PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx += 1;
+	  
+	  if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx==1023)
+	    PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx=0;
+	  else 
+	    PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx += 1;
+	}
+      }
+      
+     slot++;
+     if (slot == 20) {
+       frame++;
+       slot = 0;
+     }
+
+    
     }
 
     if (diff>8)
@@ -1569,7 +1610,9 @@ static void* eNB_thread( void* arg )
         LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
 
       hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
-      //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
+      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_slot>>1);
+      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame);
+//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
       delay_cnt++;
 
       if (delay_cnt == 10) {
@@ -1655,7 +1698,7 @@ static void* eNB_thread( void* arg )
           (rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {
         tx_launched = 1;
 
-        for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+        for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
           if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx) != 0) {
             LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx );
             exit_fun( "error locking mutex_tx" );
@@ -2984,6 +3027,7 @@ int main( int argc, char **argv )
   sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
   pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
   pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
+  printf("Setting eNB_thread FIFO scheduling policy with priority %d \n", sched_param_dlsch.sched_priority);
 #endif
 
 #endif
@@ -3015,7 +3059,6 @@ int main( int argc, char **argv )
 #endif
     printf("UE threads created\n");
   } else {
-
     if (multi_thread>0) {
       init_eNB_proc();
       sleep(1);
diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h
index c241f7dabae4858d39e2ad61cec624cbaccd3a27..e917ceaca63353f7f93a33e6027d19d776bf1ac1 100644
--- a/targets/RT/USER/rt_wrapper.h
+++ b/targets/RT/USER/rt_wrapper.h
@@ -101,6 +101,8 @@ int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned
 
 #endif
 
+#define gettid() syscall(__NR_gettid) // for gettid
+
 #else
 #include <rtai_hal.h>
 #include <rtai_lxrt.h>