From b049f0c820ad7f09e763ff3e1dc602e3f7cdc663 Mon Sep 17 00:00:00 2001
From: Navid Nikaein <navid.nikaein@eurecom.fr>
Date: Thu, 14 Dec 2017 18:34:41 +0100
Subject: [PATCH] Ue stats bugfix for dynamic reconfiguration

---
 openair2/ENB_APP/enb_app.c                    |   8 +-
 openair2/ENB_APP/flexran_agent.c              |  24 ++-
 openair2/ENB_APP/flexran_agent.h              |   1 +
 .../MAC/flexran_agent_scheduler_dlsch_ue.c    | 147 +++++++-------
 .../MAC/flexran_agent_scheduler_ulsch_ue.c    | 181 ++++++++++--------
 5 files changed, 207 insertions(+), 154 deletions(-)

diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c
index 5fe0f741bf..d51b0efcd7 100644
--- a/openair2/ENB_APP/enb_app.c
+++ b/openair2/ENB_APP/enb_app.c
@@ -283,6 +283,7 @@ void *eNB_app_task(void *args_p)
 #if defined(ENABLE_ITTI)
   uint32_t                        enb_nb = 1; /* Default number of eNB is 1 */
   uint32_t                        enb_id_start = 0;
+  uint32_t                        enb_i;
   uint32_t                        enb_id_end = enb_id_start + enb_nb;
 # if defined(ENABLE_USE_MME)
   uint32_t                        register_enb_pending;
@@ -318,7 +319,12 @@ void *eNB_app_task(void *args_p)
                enb_nb, enb_properties_p->number);
 
   enb_app_start_phy_rrc(enb_id_start, enb_id_end);
-  
+
+#ifdef FLEXRAN_AGENT_SB_IF 
+  for (enb_i = 0; enb_i <1; enb_i ++){ // To be handled for all of current eNB
+    flexran_set_enb_vars(enb_i, RAN_LTE_OAI);
+  }
+#endif 
 # if defined(ENABLE_USE_MME)
   /* Try to register each eNB */
   registered_enb = 0;
diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c
index 5a399541f5..7cb910ae1a 100644
--- a/openair2/ENB_APP/flexran_agent.c
+++ b/openair2/ENB_APP/flexran_agent.c
@@ -186,15 +186,9 @@ pthread_t new_thread(void *(*f)(void *), void *b) {
   return t;
 }
 
-int channel_container_init = 0;
-int flexran_agent_start(mid_t mod_id)
-{
-  int channel_id;
+void flexran_agent_reconfigure(mid_t mod_id){
   Enb_properties_array_t *enb_properties = enb_config_get();
-  
-  flexran_set_enb_vars(mod_id, RAN_LTE_OAI);
-  flexran_agent[mod_id].enb_id = mod_id;
-  
+
   /* 
    * check the configuration
    */ 
@@ -204,7 +198,7 @@ int flexran_agent_start(mid_t mod_id)
   } else {
     strcpy(local_cache, DEFAULT_FLEXRAN_AGENT_CACHE);
   }
-  
+
   if (enb_properties->properties[mod_id]->flexran_agent_ipv4_address != 0) {
     inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN);
   } else {
@@ -220,6 +214,18 @@ int flexran_agent_start(mid_t mod_id)
 	flexran_agent[mod_id].enb_id,
 	in_ip,
 	in_port);
+  
+}
+
+int channel_container_init = 0;
+int flexran_agent_start(mid_t mod_id)
+{
+  int channel_id;
+  
+  flexran_set_enb_vars(mod_id, RAN_LTE_OAI);
+  flexran_agent[mod_id].enb_id = mod_id;
+  
+  flexran_agent_reconfigure(mod_id);
 
   /*
    * Initialize the channel container
diff --git a/openair2/ENB_APP/flexran_agent.h b/openair2/ENB_APP/flexran_agent.h
index c1eb997e57..b092e26d53 100644
--- a/openair2/ENB_APP/flexran_agent.h
+++ b/openair2/ENB_APP/flexran_agent.h
@@ -48,6 +48,7 @@
 /* Initiation and termination of the eNodeB agent */
 int flexran_agent_start(mid_t mod_id);
 int flexran_agent_stop(mid_t mod_id);
+void flexran_agent_reconfigure(mid_t mod_id);
 
 /* 
  * enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller 
diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c
index 601310d67a..a04987f07c 100644
--- a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c
+++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c
@@ -96,9 +96,11 @@ int slicing_strategy = UEID_TO_SLICEID;
 int slicing_strategy_current = UEID_TO_SLICEID;
 
 // RB share for each slice for past and current time
-float slice_percentage[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
-float slice_percentage_current[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
+float avg_slice_percentage=0.25;
+float slice_percentage[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0};
+float slice_percentage_current[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0};
 float total_slice_percentage = 0;
+float total_slice_percentage_current = 0;
 
 // MAX MCS for each slice for past and current time
 int slice_maxmcs[MAX_NUM_SLICES] = {28, 28, 28, 28};
@@ -724,7 +726,23 @@ flexran_schedule_ue_dl_spec_default(mid_t   mod_id,
   int i=0;
   
   flexran_agent_mac_create_empty_dl_config(mod_id, dl_info);
-   
+ 
+  total_slice_percentage=0;
+  avg_slice_percentage=1.0/n_active_slices;
+  
+  // reset the slice percentage for inactive slices 
+  for (i = n_active_slices; i< MAX_NUM_SLICES; i++) {
+    slice_percentage[i]=0;
+  }
+  for (i = 0; i < n_active_slices; i++) {
+    if (slice_percentage[i] < 0 ){
+      LOG_W(MAC, "[eNB %d] frame %d subframe %d:invalid slice %d percentage %d. resetting to zero",
+	    mod_id, frame, subframe, i, slice_percentage[i]);
+      slice_percentage[i]=0;
+    }
+    total_slice_percentage+=slice_percentage[i];
+  }
+
   for (i = 0; i < n_active_slices; i++) {
     
     // Load any updated functions
@@ -732,84 +750,77 @@ flexran_schedule_ue_dl_spec_default(mid_t   mod_id,
       slice_sched_dl[i] = dlsym(NULL, dl_scheduler_type[i]); 
       update_dl_scheduler[i] = 0;
       update_dl_scheduler_current[i] = 0;
-      slice_percentage_current[i]= slice_percentage[i];
-      total_slice_percentage+=slice_percentage[i];
       LOG_N(MAC,"update dl scheduler slice %d\n", i);
     }
- 
-    // check if the number of slices has changed, and log 
-    if (n_active_slices_current != n_active_slices ){
-      if ((n_active_slices > 0) && (n_active_slices <= MAX_NUM_SLICES)) {
-	LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active slices has changed: %d-->%d\n",
-	      mod_id, frame, subframe, n_active_slices_current, n_active_slices);
 
-	n_active_slices_current = n_active_slices;
+    if (total_slice_percentage <= 1.0){ // the new total RB share is within the range
 
-      } else {
-	LOG_W(MAC,"invalid number of slices %d, revert to the previous value %d\n",n_active_slices, n_active_slices_current);
-	n_active_slices = n_active_slices_current;
+      // check if the number of slices has changed, and log 
+      if (n_active_slices_current != n_active_slices ){
+	if ((n_active_slices > 0) && (n_active_slices <= MAX_NUM_SLICES)) {
+	  LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active DL slices has changed: %d-->%d\n",
+		mod_id, frame, subframe, n_active_slices_current, n_active_slices);
+	  
+	  n_active_slices_current = n_active_slices;
+	  
+	} else {
+	  LOG_W(MAC,"invalid number of DL slices %d, revert to the previous value %d\n",n_active_slices, n_active_slices_current);
+	  n_active_slices = n_active_slices_current;
+	}
       }
-    }
+      
+      // check if the slice rb share has changed, and log the console
+      if (slice_percentage_current[i] != slice_percentage[i]){ // new slice percentage
+	LOG_N(MAC,"[eNB %d][SLICE %d][DL] frame %d subframe %d: total percentage %f-->%f, slice RB percentage has changed: %f-->%f\n",
+	      mod_id, i, frame, subframe, total_slice_percentage_current, total_slice_percentage, slice_percentage_current[i], slice_percentage[i]);
+	total_slice_percentage_current= total_slice_percentage;
+	slice_percentage_current[i] = slice_percentage[i];
+	
+      } 
+ 
+      // check if the slice max MCS, and log the console
+      if (slice_maxmcs_current[i] != slice_maxmcs[i]){
+	if ((slice_maxmcs[i] >= 0) && (slice_maxmcs[i] < 29)){
+	  LOG_N(MAC,"[eNB %d][SLICE %d][DL] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n",
+		mod_id, i, frame, subframe, slice_maxmcs_current[i], slice_maxmcs[i]);
+	  slice_maxmcs_current[i] = slice_maxmcs[i];
+	} else {
+	  LOG_W(MAC,"[eNB %d][SLICE %d][DL] invalid slice max mcs %d, revert the previous value %d\n",mod_id, i, slice_maxmcs[i],slice_maxmcs_current[i]);
+	  slice_maxmcs[i]= slice_maxmcs_current[i];
+	}
+      }
+      
+      // check if a new scheduler, and log the console
+      if (update_dl_scheduler_current[i] != update_dl_scheduler[i]){
+	LOG_N(MAC,"[eNB %d][SLICE %d][DL] frame %d subframe %d: DL scheduler for this slice is updated: %s \n",
+	      mod_id, i, frame, subframe, dl_scheduler_type[i]);
+	update_dl_scheduler_current[i] = update_dl_scheduler[i];
+      } 
     
-    // check if the slice rb share has changed, and log the console
-    if (slice_percentage_current[i] != slice_percentage[i]){
- //      if ((slice_percentage[i] >= 0.0) && (slice_percentage[i] <= 1.0)){
-	// if ((total_slice_percentage - slice_percentage_current[i]  + slice_percentage[i]) <= 1.0) {
-	//   total_slice_percentage=total_slice_percentage - slice_percentage_current[i]  + slice_percentage[i];
-	  LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: total percentage %f, slice RB percentage has changed: %f-->%f\n",
-		mod_id, i, frame, subframe, total_slice_percentage, slice_percentage_current[i], slice_percentage[i]);
-
-	  slice_percentage_current[i] = slice_percentage[i];
-
-	// } else {
-	//   LOG_W(MAC,"[eNB %d][SLICE %d] invalid total RB share (%f->%f), revert the previous value (%f->%f)\n",
-	// 	mod_id,i,  
-	// 	total_slice_percentage,
-	// 	total_slice_percentage - slice_percentage_current[i]  + slice_percentage[i],
-	// 	slice_percentage[i],slice_percentage_current[i]);
-
-	//   slice_percentage[i]= slice_percentage_current[i];
-
-	// }
- //      } else {
-	// LOG_W(MAC,"[eNB %d][SLICE %d] invalid slice RB share, revert the previous value (%f->%f)\n",mod_id, i,  slice_percentage[i],slice_percentage_current[i]);
-
-	// slice_percentage[i]= slice_percentage_current[i];
-
-      // }
-    }
-  
-    // check if the slice max MCS, and log the console
-    if (slice_maxmcs_current[i] != slice_maxmcs[i]){
-      if ((slice_maxmcs[i] >= 0) && (slice_maxmcs[i] < 29)){
-	LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n",
-	      mod_id, i, frame, subframe, slice_maxmcs_current[i], slice_maxmcs[i]);
-
-	slice_maxmcs_current[i] = slice_maxmcs[i];
-
+    } else {
+      // here we can correct the values, e.g. reduce proportionally 
+      
+      if (n_active_slices == n_active_slices_current){
+	LOG_W(MAC,"[eNB %d][SLICE %d][DL] invalid total RB share (%f->%f), reduce proportionally the RB share by 0.1\n",
+	      mod_id,i,  
+	      total_slice_percentage_current, total_slice_percentage);
+	if (slice_percentage[i] >= avg_slice_percentage){
+	  slice_percentage[i]-=0.1;
+	  total_slice_percentage-=0.1;
+	}
       } else {
-	// LOG_W(MAC,"[eNB %d][SLICE %d] invalid slice max mcs %d, revert the previous value %d\n",mod_id, i, slice_maxmcs[i],slice_percentage[i]);
-
-	slice_maxmcs[i]= slice_maxmcs_current[i];
-
+	LOG_W(MAC,"[eNB %d][SLICE %d][DL] invalid total RB share (%f->%f), revert the number of slice to its previous value (%d->%d)\n",
+	      mod_id,i,  
+	      total_slice_percentage_current, total_slice_percentage,
+	      n_active_slices, n_active_slices_current );
+	n_active_slices = n_active_slices_current;
+	slice_percentage[i] = slice_percentage_current[i];
       }
     }
     
-    // check if a new scheduler, and log the console
-    if (update_dl_scheduler_current[i] != update_dl_scheduler[i]){
-      LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: DL scheduler for this slice is updated: %s \n",
-	    mod_id, i, frame, subframe, dl_scheduler_type[i]);
-
-      update_dl_scheduler_current[i] = update_dl_scheduler[i];
-      
-    }
-
     // Run each enabled slice-specific schedulers one by one
-    //LOG_N(MAC,"[eNB %d]frame %d subframe %d slice %d: calling the scheduler\n", mod_id, frame, subframe,i);
     slice_sched_dl[i](mod_id, i, frame, subframe, mbsfn_flag,dl_info);
-
   }
-  
 }
 
 uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs){
diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_ulsch_ue.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_ulsch_ue.c
index 5b31c11681..64f21482fb 100644
--- a/openair2/LAYER2/MAC/flexran_agent_scheduler_ulsch_ue.c
+++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_ulsch_ue.c
@@ -21,7 +21,7 @@
 
 /*! \file eNB_scheduler_ulsch.c
  * \brief FlexRAN eNB procedures for the ULSCH transport channel
- * \author shahab SHARIAT BAGHERI
+ * \author Navid Nikaein and shahab SHARIAT BAGHERI
  * \date 2017
  * \version 1.0
  * @ingroup _mac
@@ -67,19 +67,21 @@
 
 /* number of active slices for  past and current time*/
 int n_active_slices_uplink = 1;
-int n_active_slices_uplink_current = 1;
+int n_active_slices_current_uplink = 1;
 
 /* RB share for each slice for past and current time*/
-float slice_percentage_uplink[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
-float slice_percentage_current_uplink[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
+float avg_slice_percentage_uplink=0.25;
+float slice_percentage_uplink[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0};
+float slice_percentage_current_uplink[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0};
 float total_slice_percentage_uplink = 0;
+float total_slice_percentage_current_uplink = 0;
 
 // MAX MCS for each slice for past and current time
 int slice_maxmcs_uplink[MAX_NUM_SLICES] = {16, 16, 16, 16};
-int slice_maxmcs_current_uplink[MAX_NUM_SLICES] = {28, 28, 28, 28};
+int slice_maxmcs_current_uplink[MAX_NUM_SLICES] = {16,16,16,16};
 
 /*resource blocks allowed*/
-uint16_t                nb_rbs_allowed_slice_uplink[MAX_NUM_CCs][MAX_NUM_SLICES];      
+uint16_t         nb_rbs_allowed_slice_uplink[MAX_NUM_CCs][MAX_NUM_SLICES];      
 /*Slice Update */
 int update_ul_scheduler[MAX_NUM_SLICES] = {1, 1, 1, 1};
 int update_ul_scheduler_current[MAX_NUM_SLICES] = {1, 1, 1, 1};
@@ -89,9 +91,9 @@ slice_scheduler_ul slice_sched_ul[MAX_NUM_SLICES] = {0};
 
 /* name of available scheduler*/
 char *ul_scheduler_type[MAX_NUM_SLICES] = {"flexran_schedule_ue_ul_spec_embb",
-					   "flexran_schedule_ue_ul_spec_urllc",
-					   "flexran_schedule_ue_ul_spec_mmtc",
-					   "flexran_schedule_ue_ul_spec_be"      // best effort 
+					   "flexran_schedule_ue_ul_spec_embb",
+					   "flexran_schedule_ue_ul_spec_embb",
+					   "flexran_schedule_ue_ul_spec_embb"      // best effort 
 };
 
 
@@ -418,6 +420,22 @@ flexran_schedule_ue_ul_spec_default(mid_t   mod_id,
   
   flexran_agent_mac_create_empty_ul_config(mod_id, ul_info);
    
+  total_slice_percentage_uplink=0;
+  avg_slice_percentage_uplink=1.0/n_active_slices_uplink;
+  
+  // reset the slice percentage for inactive slices
+  for (i = n_active_slices_uplink; i< MAX_NUM_SLICES; i++) {
+    slice_percentage_uplink[i]=0;
+  }
+  for (i = 0; i < n_active_slices_uplink; i++) {
+    if (slice_percentage_uplink[i] < 0 ){
+      LOG_W(MAC, "[eNB %d] frame %d subframe %d:invalid slice %d percentage %d. resetting to zero",
+	    mod_id, frame, subframe, i, slice_percentage_uplink[i]);
+      slice_percentage_uplink[i]=0;
+    }
+    total_slice_percentage_uplink+=slice_percentage_uplink[i];
+  }
+ 
   for (i = 0; i < n_active_slices_uplink; i++) {
     
     // Load any updated functions
@@ -425,89 +443,100 @@ flexran_schedule_ue_ul_spec_default(mid_t   mod_id,
       slice_sched_ul[i] = dlsym(NULL, ul_scheduler_type[i]); 
       update_ul_scheduler[i] = 0;
       update_ul_scheduler_current[i] = 0;
-      slice_percentage_current_uplink[i]= slice_percentage_uplink[i];
-      total_slice_percentage_uplink+=slice_percentage_uplink[i];
+      //slice_percentage_current_uplink[i]= slice_percentage_uplink[i];
+      //total_slice_percentage_current_uplink+=slice_percentage_uplink[i];
+      //if (total_slice_percentage_current_uplink> 1) 
+      //	total_slice_percentage_current_uplink=1;
       LOG_N(MAC,"update ul scheduler slice %d\n", i);
     }
- 
-    // check if the number of slices has changed, and log 
-    if (n_active_slices_uplink_current != n_active_slices_uplink ){
-      if ((n_active_slices_uplink > 0) && (n_active_slices_uplink <= MAX_NUM_SLICES)) {
-	LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active slices has changed: %d-->%d\n",
-	      mod_id, frame, subframe, n_active_slices_uplink_current, n_active_slices_uplink);
-
-	n_active_slices_uplink_current = n_active_slices_uplink;
-
-      } else {
-	LOG_W(MAC,"invalid number of slices %d, revert to the previous value %d\n",n_active_slices_uplink, n_active_slices_uplink_current);
-	n_active_slices_uplink = n_active_slices_uplink_current;
+    // the new total RB share is within the range
+    if (total_slice_percentage_uplink <= 1.0){
+
+      // check if the number of slices has changed, and log 
+      if (n_active_slices_current_uplink != n_active_slices_uplink ){
+	if ((n_active_slices_uplink > 0) && (n_active_slices_uplink <= MAX_NUM_SLICES)) {
+	  LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active UL slices has changed: %d-->%d\n",
+		mod_id, frame, subframe, n_active_slices_current_uplink, n_active_slices_uplink);
+	  
+	  n_active_slices_current_uplink = n_active_slices_uplink;
+	  
+	} else {
+	  LOG_W(MAC,"invalid number of UL slices %d, revert to the previous value %d\n",n_active_slices_uplink, n_active_slices_current_uplink);
+	  n_active_slices_uplink = n_active_slices_current_uplink;
+	}
       }
-    }
     
     // check if the slice rb share has changed, and log the console
-    if (slice_percentage_current_uplink[i] != slice_percentage_uplink[i]){
- //      if ((slice_percentage_uplink[i] >= 0.0) && (slice_percentage_uplink[i] <= 1.0)){
-	// if ((total_slice_percentage_uplink - slice_percentage_current_uplink[i]  + slice_percentage_uplink[i]) <= 1.0) {
-	//   total_slice_percentage_uplink=total_slice_percentage_uplink - slice_percentage_current_uplink[i]  + slice_percentage_uplink[i];
-	  LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: total percentage %f, slice RB percentage has changed: %f-->%f\n",
-		mod_id, i, frame, subframe, total_slice_percentage_uplink, slice_percentage_current_uplink[i], slice_percentage_uplink[i]);
-
-	  slice_percentage_current_uplink[i] = slice_percentage_uplink[i];
-
-	// } else {
-	//   LOG_W(MAC,"[eNB %d][SLICE %d] invalid total RB share (%f->%f), revert the previous value (%f->%f)\n",
-	// 	mod_id,i,  
-	// 	total_slice_percentage_uplink,
-	// 	total_slice_percentage_uplink - slice_percentage_current_uplink[i]  + slice_percentage_uplink[i],
-	// 	slice_percentage_uplink[i],slice_percentage_current_uplink[i]);
-
-	//   slice_percentage_uplink[i]= slice_percentage_current_uplink[i];
-
-	// }
- //      } else {
-	// LOG_W(MAC,"[eNB %d][SLICE %d] invalid slice RB share, revert the previous value (%f->%f)\n",mod_id, i,  slice_percentage_uplink[i],slice_percentage_current_uplink[i]);
-
-	// slice_percentage_uplink[i]= slice_percentage_current_uplink[i];
-
-      // }
-    }
-  
-    // check if a new scheduler, and log the console
-    if (update_ul_scheduler_current[i] != update_ul_scheduler[i]){
-      LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: DL scheduler for this slice is updated: %s \n",
-	    mod_id, i, frame, subframe, ul_scheduler_type[i]);
-
-      update_ul_scheduler_current[i] = update_ul_scheduler[i];
+      if (slice_percentage_current_uplink[i] != slice_percentage_uplink[i]){ 
+      LOG_N(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: total percentage %f-->%f, slice RB percentage has changed: %f-->%f\n",
+	      mod_id, i, frame, subframe, total_slice_percentage_current_uplink, total_slice_percentage_uplink, slice_percentage_current_uplink[i], slice_percentage_uplink[i]);
+	total_slice_percentage_current_uplink= total_slice_percentage_uplink;
+	slice_percentage_current_uplink[i] = slice_percentage_uplink[i];	
+	
+      } 
       
+      // check if the slice max MCS, and log the console
+      if (slice_maxmcs_current_uplink[i] != slice_maxmcs_uplink[i]){
+	if ((slice_maxmcs_uplink[i] >= 0) && (slice_maxmcs_uplink[i] <= 16)){
+	  LOG_N(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n",
+		mod_id, i, frame, subframe, slice_maxmcs_current_uplink[i], slice_maxmcs_uplink[i]);
+	  slice_maxmcs_current_uplink[i] = slice_maxmcs_uplink[i];
+	} else {
+	  LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid slice max mcs %d, revert the previous value %d\n",mod_id, i, slice_maxmcs_uplink[i],slice_maxmcs_current_uplink[i]);
+	  slice_maxmcs_uplink[i]= slice_maxmcs_current_uplink[i];
+	  
+	}
+      }
+      
+      // check if a new scheduler, and log the console
+      if (update_ul_scheduler_current[i] != update_ul_scheduler[i]){
+	LOG_N(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: UL scheduler for this slice is updated: %s \n",
+	      mod_id, i, frame, subframe, ul_scheduler_type[i]);
+	
+	update_ul_scheduler_current[i] = update_ul_scheduler[i];
+      }
     }
-
+      else {
+	
+	if (n_active_slices_uplink == n_active_slices_current_uplink){
+	  LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid total RB share (%f->%f), reduce proportionally the RB share by 0.1\n",
+		mod_id,i,  
+		total_slice_percentage_current_uplink, total_slice_percentage_uplink);
+	  if (slice_percentage_uplink[i] > avg_slice_percentage_uplink){
+	    slice_percentage_uplink[i]-=0.1;
+	    total_slice_percentage_uplink-=0.1;
+	  }
+	} else {
+	  // here we can correct the values, e.g. reduce proportionally 
+	  LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid total RB share (%f->%f), revert the  number of slice to its previous value (%d->%d)\n",
+		mod_id,i,  
+		total_slice_percentage_current_uplink, total_slice_percentage_uplink,
+		n_active_slices_uplink, n_active_slices_current_uplink);
+	  n_active_slices_uplink = n_active_slices_current_uplink;
+	  slice_percentage_uplink[i] = slice_percentage_current_uplink[i];
+	}
+      }
+     
     // Run each enabled slice-specific schedulers one by one
-    //LOG_N(MAC,"[eNB %d]frame %d subframe %d slice %d: calling the scheduler\n", mod_id, frame, subframe,i);
-    
-
     slice_sched_ul[i](mod_id, frame, cooperation_flag, subframe, sched_subframe,ul_info);
-
   }
-
-    
-  
 }
 
 void
 flexran_schedule_ue_ul_spec_embb(mid_t  mod_id,
-			                    frame_t frame, 
-			                    unsigned char cooperation_flag,
-                		        uint32_t      subframe,
-			                    unsigned char sched_subframe,
-			                    Protocol__FlexranMessage **ul_info)
-
+				 frame_t frame, 
+				 unsigned char cooperation_flag,
+				 uint32_t      subframe,
+				 unsigned char sched_subframe,
+				 Protocol__FlexranMessage **ul_info)
+  
 {
   flexran_agent_schedule_ulsch_ue_spec(mod_id,
-				                      frame,
-				                      cooperation_flag,
-				                      subframe,
-				                      sched_subframe,
-				                      ul_info);
+				       frame,
+				       cooperation_flag,
+				       subframe,
+				       sched_subframe,
+				       ul_info);
   
 }
 
-- 
GitLab