Ue stats bugfix for dynamic reconfiguration
This commit is contained in:
committed by
Anta Huang
parent
d35f52a228
commit
b049f0c820
@@ -283,6 +283,7 @@ void *eNB_app_task(void *args_p)
|
|||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
uint32_t enb_nb = 1; /* Default number of eNB is 1 */
|
uint32_t enb_nb = 1; /* Default number of eNB is 1 */
|
||||||
uint32_t enb_id_start = 0;
|
uint32_t enb_id_start = 0;
|
||||||
|
uint32_t enb_i;
|
||||||
uint32_t enb_id_end = enb_id_start + enb_nb;
|
uint32_t enb_id_end = enb_id_start + enb_nb;
|
||||||
# if defined(ENABLE_USE_MME)
|
# if defined(ENABLE_USE_MME)
|
||||||
uint32_t register_enb_pending;
|
uint32_t register_enb_pending;
|
||||||
@@ -318,7 +319,12 @@ void *eNB_app_task(void *args_p)
|
|||||||
enb_nb, enb_properties_p->number);
|
enb_nb, enb_properties_p->number);
|
||||||
|
|
||||||
enb_app_start_phy_rrc(enb_id_start, enb_id_end);
|
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)
|
# if defined(ENABLE_USE_MME)
|
||||||
/* Try to register each eNB */
|
/* Try to register each eNB */
|
||||||
registered_enb = 0;
|
registered_enb = 0;
|
||||||
|
|||||||
@@ -186,15 +186,9 @@ pthread_t new_thread(void *(*f)(void *), void *b) {
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
int channel_container_init = 0;
|
void flexran_agent_reconfigure(mid_t mod_id){
|
||||||
int flexran_agent_start(mid_t mod_id)
|
|
||||||
{
|
|
||||||
int channel_id;
|
|
||||||
Enb_properties_array_t *enb_properties = enb_config_get();
|
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
|
* check the configuration
|
||||||
*/
|
*/
|
||||||
@@ -204,7 +198,7 @@ int flexran_agent_start(mid_t mod_id)
|
|||||||
} else {
|
} else {
|
||||||
strcpy(local_cache, DEFAULT_FLEXRAN_AGENT_CACHE);
|
strcpy(local_cache, DEFAULT_FLEXRAN_AGENT_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enb_properties->properties[mod_id]->flexran_agent_ipv4_address != 0) {
|
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);
|
inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN);
|
||||||
} else {
|
} else {
|
||||||
@@ -220,6 +214,18 @@ int flexran_agent_start(mid_t mod_id)
|
|||||||
flexran_agent[mod_id].enb_id,
|
flexran_agent[mod_id].enb_id,
|
||||||
in_ip,
|
in_ip,
|
||||||
in_port);
|
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
|
* Initialize the channel container
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
/* Initiation and termination of the eNodeB agent */
|
/* Initiation and termination of the eNodeB agent */
|
||||||
int flexran_agent_start(mid_t mod_id);
|
int flexran_agent_start(mid_t mod_id);
|
||||||
int flexran_agent_stop(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
|
* enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller
|
||||||
|
|||||||
@@ -96,9 +96,11 @@ int slicing_strategy = UEID_TO_SLICEID;
|
|||||||
int slicing_strategy_current = UEID_TO_SLICEID;
|
int slicing_strategy_current = UEID_TO_SLICEID;
|
||||||
|
|
||||||
// RB share for each slice for past and current time
|
// 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 avg_slice_percentage=0.25;
|
||||||
float slice_percentage_current[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
|
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 = 0;
|
||||||
|
float total_slice_percentage_current = 0;
|
||||||
|
|
||||||
// MAX MCS for each slice for past and current time
|
// MAX MCS for each slice for past and current time
|
||||||
int slice_maxmcs[MAX_NUM_SLICES] = {28, 28, 28, 28};
|
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;
|
int i=0;
|
||||||
|
|
||||||
flexran_agent_mac_create_empty_dl_config(mod_id, dl_info);
|
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++) {
|
for (i = 0; i < n_active_slices; i++) {
|
||||||
|
|
||||||
// Load any updated functions
|
// 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]);
|
slice_sched_dl[i] = dlsym(NULL, dl_scheduler_type[i]);
|
||||||
update_dl_scheduler[i] = 0;
|
update_dl_scheduler[i] = 0;
|
||||||
update_dl_scheduler_current[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);
|
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 {
|
// check if the number of slices has changed, and log
|
||||||
LOG_W(MAC,"invalid number of slices %d, revert to the previous value %d\n",n_active_slices, n_active_slices_current);
|
if (n_active_slices_current != n_active_slices ){
|
||||||
n_active_slices = n_active_slices_current;
|
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]){
|
|
||||||
// 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 {
|
|
||||||
// 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];
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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];
|
|
||||||
|
|
||||||
|
// 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
} 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][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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run each enabled slice-specific schedulers one by one
|
// 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);
|
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){
|
uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs){
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
/*! \file eNB_scheduler_ulsch.c
|
/*! \file eNB_scheduler_ulsch.c
|
||||||
* \brief FlexRAN eNB procedures for the ULSCH transport channel
|
* \brief FlexRAN eNB procedures for the ULSCH transport channel
|
||||||
* \author shahab SHARIAT BAGHERI
|
* \author Navid Nikaein and shahab SHARIAT BAGHERI
|
||||||
* \date 2017
|
* \date 2017
|
||||||
* \version 1.0
|
* \version 1.0
|
||||||
* @ingroup _mac
|
* @ingroup _mac
|
||||||
@@ -67,19 +67,21 @@
|
|||||||
|
|
||||||
/* number of active slices for past and current time*/
|
/* number of active slices for past and current time*/
|
||||||
int n_active_slices_uplink = 1;
|
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*/
|
/* 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 avg_slice_percentage_uplink=0.25;
|
||||||
float slice_percentage_current_uplink[MAX_NUM_SLICES] = {1.0, 1.0, 0.0, 0.0};
|
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_uplink = 0;
|
||||||
|
float total_slice_percentage_current_uplink = 0;
|
||||||
|
|
||||||
// MAX MCS for each slice for past and current time
|
// MAX MCS for each slice for past and current time
|
||||||
int slice_maxmcs_uplink[MAX_NUM_SLICES] = {16, 16, 16, 16};
|
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*/
|
/*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 */
|
/*Slice Update */
|
||||||
int update_ul_scheduler[MAX_NUM_SLICES] = {1, 1, 1, 1};
|
int update_ul_scheduler[MAX_NUM_SLICES] = {1, 1, 1, 1};
|
||||||
int update_ul_scheduler_current[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*/
|
/* name of available scheduler*/
|
||||||
char *ul_scheduler_type[MAX_NUM_SLICES] = {"flexran_schedule_ue_ul_spec_embb",
|
char *ul_scheduler_type[MAX_NUM_SLICES] = {"flexran_schedule_ue_ul_spec_embb",
|
||||||
"flexran_schedule_ue_ul_spec_urllc",
|
"flexran_schedule_ue_ul_spec_embb",
|
||||||
"flexran_schedule_ue_ul_spec_mmtc",
|
"flexran_schedule_ue_ul_spec_embb",
|
||||||
"flexran_schedule_ue_ul_spec_be" // best effort
|
"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);
|
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++) {
|
for (i = 0; i < n_active_slices_uplink; i++) {
|
||||||
|
|
||||||
// Load any updated functions
|
// 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]);
|
slice_sched_ul[i] = dlsym(NULL, ul_scheduler_type[i]);
|
||||||
update_ul_scheduler[i] = 0;
|
update_ul_scheduler[i] = 0;
|
||||||
update_ul_scheduler_current[i] = 0;
|
update_ul_scheduler_current[i] = 0;
|
||||||
slice_percentage_current_uplink[i]= slice_percentage_uplink[i];
|
//slice_percentage_current_uplink[i]= slice_percentage_uplink[i];
|
||||||
total_slice_percentage_uplink+=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);
|
LOG_N(MAC,"update ul scheduler slice %d\n", i);
|
||||||
}
|
}
|
||||||
|
// the new total RB share is within the range
|
||||||
// check if the number of slices has changed, and log
|
if (total_slice_percentage_uplink <= 1.0){
|
||||||
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;
|
// check if the number of slices has changed, and log
|
||||||
|
if (n_active_slices_current_uplink != n_active_slices_uplink ){
|
||||||
} else {
|
if ((n_active_slices_uplink > 0) && (n_active_slices_uplink <= MAX_NUM_SLICES)) {
|
||||||
LOG_W(MAC,"invalid number of slices %d, revert to the previous value %d\n",n_active_slices_uplink, n_active_slices_uplink_current);
|
LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active UL slices has changed: %d-->%d\n",
|
||||||
n_active_slices_uplink = n_active_slices_uplink_current;
|
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
|
// 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_current_uplink[i] != slice_percentage_uplink[i]){
|
||||||
// if ((slice_percentage_uplink[i] >= 0.0) && (slice_percentage_uplink[i] <= 1.0)){
|
LOG_N(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: total percentage %f-->%f, slice RB percentage has changed: %f-->%f\n",
|
||||||
// if ((total_slice_percentage_uplink - slice_percentage_current_uplink[i] + slice_percentage_uplink[i]) <= 1.0) {
|
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_uplink=total_slice_percentage_uplink - slice_percentage_current_uplink[i] + slice_percentage_uplink[i];
|
total_slice_percentage_current_uplink= total_slice_percentage_uplink;
|
||||||
LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: total percentage %f, slice RB percentage has changed: %f-->%f\n",
|
slice_percentage_current_uplink[i] = slice_percentage_uplink[i];
|
||||||
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];
|
|
||||||
|
|
||||||
|
// 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
|
// 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);
|
slice_sched_ul[i](mod_id, frame, cooperation_flag, subframe, sched_subframe,ul_info);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
flexran_schedule_ue_ul_spec_embb(mid_t mod_id,
|
flexran_schedule_ue_ul_spec_embb(mid_t mod_id,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
unsigned char cooperation_flag,
|
unsigned char cooperation_flag,
|
||||||
uint32_t subframe,
|
uint32_t subframe,
|
||||||
unsigned char sched_subframe,
|
unsigned char sched_subframe,
|
||||||
Protocol__FlexranMessage **ul_info)
|
Protocol__FlexranMessage **ul_info)
|
||||||
|
|
||||||
{
|
{
|
||||||
flexran_agent_schedule_ulsch_ue_spec(mod_id,
|
flexran_agent_schedule_ulsch_ue_spec(mod_id,
|
||||||
frame,
|
frame,
|
||||||
cooperation_flag,
|
cooperation_flag,
|
||||||
subframe,
|
subframe,
|
||||||
sched_subframe,
|
sched_subframe,
|
||||||
ul_info);
|
ul_info);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user