Commit 22348335 authored by Niccolò Iardella's avatar Niccolò Iardella Committed by Robert Schmidt

Move slicing configuration variables in header files

parent 361af123
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
//#include "LAYER2/MAC/pre_processor.c" //#include "LAYER2/MAC/pre_processor.c"
#include "eNB_scheduler_dlsch.h"
#include "pdcp.h" #include "pdcp.h"
#include "SIMULATION/TOOLS/defs.h" // for taus #include "SIMULATION/TOOLS/defs.h" // for taus
...@@ -71,44 +72,6 @@ ...@@ -71,44 +72,6 @@
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
extern uint8_t nfapi_mode; extern uint8_t nfapi_mode;
// number of active slices for past and current time
int n_active_slices = 1;
int n_active_slices_current = 1;
// RB share for each slice for past and current time
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;
// Frequency ranges for slice positioning
int slice_position[MAX_NUM_SLICES*2] = {0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX};
int slice_position_current[MAX_NUM_SLICES*2] = {0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX};
// MAX MCS for each slice for past and current time
int slice_maxmcs[MAX_NUM_SLICES] = { 28, 28, 28, 28 };
int slice_maxmcs_current[MAX_NUM_SLICES] = { 28, 28, 28, 28 };
int update_dl_scheduler[MAX_NUM_SLICES] = { 1, 1, 1, 1 };
int update_dl_scheduler_current[MAX_NUM_SLICES] = { 1, 1, 1, 1 };
// name of available scheduler
char *dl_scheduler_type[MAX_NUM_SLICES] =
{ "schedule_ue_spec",
"schedule_ue_spec",
"schedule_ue_spec",
"schedule_ue_spec"
};
// The lists of criteria that enforce the sorting policies of the slices
uint32_t sorting_policy[MAX_NUM_SLICES] = {0x01234, 0x01234, 0x01234, 0x01234};
uint32_t sorting_policy_current[MAX_NUM_SLICES] = {0x01234, 0x01234, 0x01234, 0x01234};
// pointer to the slice specific scheduler
slice_scheduler_dl slice_sched_dl[MAX_NUM_SLICES] = {0};
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void void
add_ue_dlsch_info(module_id_t module_idP, add_ue_dlsch_info(module_id_t module_idP,
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file LAYER2/MAC/eNB_scheduler_dlsch.h
* \brief DLSCH Scheduler policy variables used during different phases of scheduling
* \author Navid Nikaein and Niccolo' Iardella
* \date 2018
* \version 0.2
* \email navid.nikaein@eurecom.fr
*/
/** @defgroup _oai2 openair2 Reference Implementation
* @ingroup _ref_implementation_
* @{
*/
/*@}*/
#ifndef __LAYER2_MAC_ENB_SCHEDULER_DLSCH_H__
#define __LAYER2_MAC_ENB_SCHEDULER_DLSCH_H__
// number of active slices for past and current time
int n_active_slices = 1;
int n_active_slices_current = 1;
// RB share for each slice for past and current time
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;
// Frequency ranges for slice positioning
int slice_position[MAX_NUM_SLICES*2] = {0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX};
int slice_position_current[MAX_NUM_SLICES*2] = {0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX, 0, N_RBG_MAX};
// MAX MCS for each slice for past and current time
int slice_maxmcs[MAX_NUM_SLICES] = { 28, 28, 28, 28 };
int slice_maxmcs_current[MAX_NUM_SLICES] = { 28, 28, 28, 28 };
int update_dl_scheduler[MAX_NUM_SLICES] = { 1, 1, 1, 1 };
int update_dl_scheduler_current[MAX_NUM_SLICES] = { 1, 1, 1, 1 };
// name of available scheduler
char *dl_scheduler_type[MAX_NUM_SLICES] =
{ "schedule_ue_spec",
"schedule_ue_spec",
"schedule_ue_spec",
"schedule_ue_spec"
};
// The lists of criteria that enforce the sorting policies of the slices
uint32_t sorting_policy[MAX_NUM_SLICES] = {0x01234, 0x01234, 0x01234, 0x01234};
uint32_t sorting_policy_current[MAX_NUM_SLICES] = {0x01234, 0x01234, 0x01234, 0x01234};
// pointer to the slice specific scheduler
slice_scheduler_dl slice_sched_dl[MAX_NUM_SLICES] = {0};
#endif //__LAYER2_MAC_ENB_SCHEDULER_DLSCH_H__
...@@ -4135,7 +4135,7 @@ harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, ...@@ -4135,7 +4135,7 @@ harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP,
// Flexran Slicing functions // Flexran Slicing functions
uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs) uint16_t nb_rbs_allowed_slice(float rb_percentage, int total_rbs)
{ {
return (uint16_t) floor(rb_percentage * total_rbs); return (uint16_t) floor(rb_percentage * total_rbs);
} }
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
//#include "LAYER2/MAC/pre_processor.c" //#include "LAYER2/MAC/pre_processor.c"
#include "eNB_scheduler_ulsch.h"
#include "pdcp.h" #include "pdcp.h"
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
...@@ -75,45 +76,12 @@ extern uint16_t sfnsf_add_subframe(uint16_t frameP, uint16_t subframeP, int offs ...@@ -75,45 +76,12 @@ extern uint16_t sfnsf_add_subframe(uint16_t frameP, uint16_t subframeP, int offs
extern int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req); extern int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req);
extern uint8_t nfapi_mode; extern uint8_t nfapi_mode;
extern uint8_t nfapi_mode;
// This table holds the allowable PRB sizes for ULSCH transmissions // This table holds the allowable PRB sizes for ULSCH transmissions
uint8_t rb_table[34] = uint8_t rb_table[34] =
{ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32,
36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100
}; };
/* number of active slices for past and current time*/
int n_active_slices_uplink = 1;
int n_active_slices_current_uplink = 1;
/* RB share for each slice for past and current time*/
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] = {20, 20, 20, 20};
int slice_maxmcs_current_uplink[MAX_NUM_SLICES] = {20,20,20,20};
/*resource blocks allowed*/
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};
/* name of available scheduler*/
char *ul_scheduler_type[MAX_NUM_SLICES] = {"schedule_ulsch_rnti",
"schedule_ulsch_rnti",
"schedule_ulsch_rnti",
"schedule_ulsch_rnti"
};
/* Slice Function Pointer */
slice_scheduler_ul slice_sched_ul[MAX_NUM_SLICES] = {0};
void void
rx_sdu(const module_id_t enb_mod_idP, rx_sdu(const module_id_t enb_mod_idP,
const int CC_idP, const int CC_idP,
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file LAYER2/MAC/eNB_scheduler_ulsch.h
* \brief ULSCH Scheduler policy variables used during different phases of scheduling
* \author Navid Nikaein and Niccolo' Iardella
* \date 2018
* \version 0.2
* \email navid.nikaein@eurecom.fr
*/
/** @defgroup _oai2 openair2 Reference Implementation
* @ingroup _ref_implementation_
* @{
*/
/*@}*/
#ifndef __LAYER2_MAC_ENB_SCHEDULER_ULSCH_H__
#define __LAYER2_MAC_ENB_SCHEDULER_ULSCH_H__
/* number of active slices for past and current time*/
int n_active_slices_uplink = 1;
int n_active_slices_current_uplink = 1;
/* RB share for each slice for past and current time*/
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] = {20, 20, 20, 20};
int slice_maxmcs_current_uplink[MAX_NUM_SLICES] = {20,20,20,20};
/*resource blocks allowed*/
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};
/* name of available scheduler*/
char *ul_scheduler_type[MAX_NUM_SLICES] = {"schedule_ulsch_rnti",
"schedule_ulsch_rnti",
"schedule_ulsch_rnti",
"schedule_ulsch_rnti"
};
/* Slice Function Pointer */
slice_scheduler_ul slice_sched_ul[MAX_NUM_SLICES] = {0};
#endif //__LAYER2_MAC_ENB_SCHEDULER_ULSCH_H__
...@@ -268,7 +268,8 @@ assign_rbs_required(module_id_t Mod_id, ...@@ -268,7 +268,8 @@ assign_rbs_required(module_id_t Mod_id,
to_prb(RC.mac[Mod_id]->common_channels[CC_id]. to_prb(RC.mac[Mod_id]->common_channels[CC_id].
mib->message.dl_Bandwidth); mib->message.dl_Bandwidth);
UE_list->UE_sched_ctrl[UE_id].max_rbs_allowed_slice[CC_id][slice_id]= flexran_nb_rbs_allowed_slice(slice_percentage[slice_id],N_RB_DL); UE_list->UE_sched_ctrl[UE_id].max_rbs_allowed_slice[CC_id][slice_id] =
nb_rbs_allowed_slice(slice_percentage[slice_id], N_RB_DL);
/* calculating required number of RBs for each UE */ /* calculating required number of RBs for each UE */
while (TBS < while (TBS <
...@@ -504,43 +505,37 @@ void decode_slice_positioning(module_id_t Mod_idP, ...@@ -504,43 +505,37 @@ void decode_slice_positioning(module_id_t Mod_idP,
// This fuction sorts the UE in order their dlsch buffer and CQI // This fuction sorts the UE in order their dlsch buffer and CQI
void sort_UEs(module_id_t Mod_idP, slice_id_t slice_id, int frameP, sub_frame_t subframeP) void sort_UEs(module_id_t Mod_idP, slice_id_t slice_id, int frameP, sub_frame_t subframeP) {
{ int i;
int i; int list[NUMBER_OF_UE_MAX];
int list[NUMBER_OF_UE_MAX]; int list_size = 0;
int list_size = 0; struct sort_ue_dl_params params = {Mod_idP, frameP, subframeP, slice_id};
int rnti;
struct sort_ue_dl_params params = { Mod_idP, frameP, subframeP, slice_id };
UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list;
for (i = 0; i < NUMBER_OF_UE_MAX; i++) { for (i = 0; i < NUMBER_OF_UE_MAX; ++i) {
if (UE_list->active[i] == FALSE) if (UE_list->active[i] == FALSE) continue;
continue; if (UE_RNTI(Mod_idP, i) == NOT_A_RNTI) continue;
if ((rnti = UE_RNTI(Mod_idP, i)) == NOT_A_RNTI) if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue;
continue; if (!ue_slice_membership(i, slice_id)) continue;
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
continue;
if (!ue_slice_membership(i, slice_id))
continue;
list[list_size] = i; list[list_size] = i;
list_size++; list_size++;
} }
decode_sorting_policy(Mod_idP, slice_id); decode_sorting_policy(Mod_idP, slice_id);
qsort_r(list, list_size, sizeof(int), ue_dl_compare, &params); qsort_r(list, list_size, sizeof(int), ue_dl_compare, &params);
if (list_size) { if (list_size) {
for (i = 0; i < list_size - 1; i++) for (i = 0; i < list_size - 1; ++i)
UE_list->next[list[i]] = list[i + 1]; UE_list->next[list[i]] = list[i + 1];
UE_list->next[list[list_size - 1]] = -1; UE_list->next[list[list_size - 1]] = -1;
UE_list->head = list[0]; UE_list->head = list[0];
} else { } else {
UE_list->head = -1; UE_list->head = -1;
} }
#if 0 #if 0
...@@ -622,7 +617,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -622,7 +617,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
int min_rb_unit[MAX_NUM_CCs], int min_rb_unit[MAX_NUM_CCs],
uint8_t total_ue_count[MAX_NUM_CCs], uint8_t total_ue_count[MAX_NUM_CCs],
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]) uint16_t nb_rbs_accounted[MAX_NUM_CCs][NUMBER_OF_UE_MAX])
{ {
...@@ -646,18 +641,15 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -646,18 +641,15 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
average_rbs_per_user[CC_id] = 0; average_rbs_per_user[CC_id] = 0;
} }
// loop over all active UEs // Find total UE count, and account the RBs required for retransmissions
for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
rnti = UE_RNTI(Mod_id, UE_id); rnti = UE_RNTI(Mod_id, UE_id);
if (rnti == NOT_A_RNTI) if (rnti == NOT_A_RNTI) continue;
continue; if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) continue;
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) if (!ue_slice_membership(UE_id, slice_id)) continue;
continue;
if (!ue_slice_membership(UE_id, slice_id))
continue;
for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) { for (i = 0; i < UE_num_active_CC(UE_list, UE_id); ++i) {
CC_id = UE_list->ordered_CCids[i][UE_id]; CC_id = UE_list->ordered_CCids[i][UE_id];
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
cc = &RC.mac[Mod_id]->common_channels[CC_id]; cc = &RC.mac[Mod_id]->common_channels[CC_id];
...@@ -686,12 +678,9 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -686,12 +678,9 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
rnti = UE_RNTI(Mod_id, UE_id); rnti = UE_RNTI(Mod_id, UE_id);
if (rnti == NOT_A_RNTI) if (rnti == NOT_A_RNTI) continue;
continue; if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) continue;
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) if (!ue_slice_membership(UE_id, slice_id)) continue;
continue;
if (!ue_slice_membership(UE_id, slice_id))
continue;
for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) { for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) {
CC_id = UE_list->ordered_CCids[i][UE_id]; CC_id = UE_list->ordered_CCids[i][UE_id];
...@@ -710,8 +699,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -710,8 +699,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
// recalculate based on the what is left after retransmission // recalculate based on the what is left after retransmission
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id] = ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id] = nb_rbs_allowed_slice(slice_percentage[slice_id], N_RB_DL);
flexran_nb_rbs_allowed_slice(slice_percentage[slice_id], N_RB_DL);
if (total_ue_count[CC_id] == 0) { if (total_ue_count[CC_id] == 0) {
average_rbs_per_user[CC_id] = 0; average_rbs_per_user[CC_id] = 0;
...@@ -719,8 +707,8 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -719,8 +707,8 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
(ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id])) { (ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id])) {
average_rbs_per_user[CC_id] = average_rbs_per_user[CC_id] =
(uint16_t) floor(ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id] / total_ue_count[CC_id]); (uint16_t) floor(ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_id] / total_ue_count[CC_id]);
} else { } else {
// consider the total number of use that can be scheduled UE // consider the total number of use that can be scheduled UE
average_rbs_per_user[CC_id] = min_rb_unit[CC_id]; average_rbs_per_user[CC_id] = min_rb_unit[CC_id];
} }
} }
...@@ -752,9 +740,9 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -752,9 +740,9 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
// control channel or retransmission // control channel or retransmission
/* TODO: do we have to check for retransmission? */ /* TODO: do we have to check for retransmission? */
if (mac_eNB_get_rrc_status(Mod_id, rnti) < RRC_RECONFIGURED || round != 8) { if (mac_eNB_get_rrc_status(Mod_id, rnti) < RRC_RECONFIGURED || round != 8) {
nb_rbs_required_remaining_1[CC_id][UE_id] = nb_rbs_required[CC_id][UE_id]; nb_rbs_accounted[CC_id][UE_id] = nb_rbs_required[CC_id][UE_id];
} else { } else {
nb_rbs_required_remaining_1[CC_id][UE_id] = cmin(average_rbs_per_user[CC_id], nb_rbs_required[CC_id][UE_id]); nb_rbs_accounted[CC_id][UE_id] = cmin(average_rbs_per_user[CC_id], nb_rbs_required[CC_id][UE_id]);
} }
} }
} }
...@@ -766,7 +754,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -766,7 +754,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
int min_rb_unit[MAX_NUM_CCs], int min_rb_unit[MAX_NUM_CCs],
uint8_t total_ue_count[MAX_NUM_CCs], uint8_t total_ue_count[MAX_NUM_CCs],
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_accounted[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint8_t rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], uint8_t rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
uint8_t MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { uint8_t MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) {
...@@ -793,11 +781,11 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -793,11 +781,11 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
if (r1 == 0) { if (r1 == 0) {
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] =
nb_rbs_required_remaining_1[CC_id][UE_id]; nb_rbs_accounted[CC_id][UE_id];
} else { // rb required based only on the buffer - rb allocated in the 1st round + extra reaming rb form the 1st round } else { // rb required based only on the buffer - rb allocated in the 1st round + extra reaming rb form the 1st round
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] =
nb_rbs_required[CC_id][UE_id] - nb_rbs_required[CC_id][UE_id] -
nb_rbs_required_remaining_1[CC_id][UE_id] + nb_rbs_accounted[CC_id][UE_id] +
nb_rbs_required_remaining[CC_id][UE_id]; nb_rbs_required_remaining[CC_id][UE_id];
if (nb_rbs_required_remaining[CC_id][UE_id] < 0) if (nb_rbs_required_remaining[CC_id][UE_id] < 0)
abort(); abort();
...@@ -808,7 +796,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -808,7 +796,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
"round %d : nb_rbs_required_remaining[%d][%d]= %d (remaining_1 %d, required %d, pre_nb_available_rbs %d, N_RBG %d, rb_unit %d)\n", "round %d : nb_rbs_required_remaining[%d][%d]= %d (remaining_1 %d, required %d, pre_nb_available_rbs %d, N_RBG %d, rb_unit %d)\n",
r1, CC_id, UE_id, r1, CC_id, UE_id,
nb_rbs_required_remaining[CC_id][UE_id], nb_rbs_required_remaining[CC_id][UE_id],
nb_rbs_required_remaining_1[CC_id][UE_id], nb_rbs_accounted[CC_id][UE_id],
nb_rbs_required[CC_id][UE_id], nb_rbs_required[CC_id][UE_id],
UE_list->UE_sched_ctrl[UE_id].pre_nb_available_rbs[CC_id], UE_list->UE_sched_ctrl[UE_id].pre_nb_available_rbs[CC_id],
N_RBG[CC_id], N_RBG[CC_id],
...@@ -824,8 +812,6 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -824,8 +812,6 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
CC_id = UE_list->ordered_CCids[i][UE_id]; CC_id = UE_list->ordered_CCids[i][UE_id];
// if there are UEs with traffic // if there are UEs with traffic
if (total_ue_count[CC_id] > 0) { if (total_ue_count[CC_id] > 0) {
// ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
// round = ue_sched_ctl->round[CC_id][harq_pid];
rnti = UE_RNTI(Mod_id, UE_id); rnti = UE_RNTI(Mod_id, UE_id);
...@@ -838,9 +824,6 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -838,9 +824,6 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
continue; continue;
transmission_mode = get_tmode(Mod_id, CC_id, UE_id); transmission_mode = get_tmode(Mod_id, CC_id, UE_id);
// mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
// rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti);
/* 1st allocate for the retx */
// retransmission in data channels // retransmission in data channels
// control channel in the 1st transmission // control channel in the 1st transmission
...@@ -859,166 +842,166 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -859,166 +842,166 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
MIMO_mode_indicator); MIMO_mode_indicator);
#ifdef TM5 #ifdef TM5
// data chanel TM5: to be revisited // data chanel TM5: to be revisited
if ((round == 0) && if ((round == 0) &&
(transmission_mode == 5) && (transmission_mode == 5) &&
(ue_sched_ctl->dl_pow_off[CC_id] != 1)) { (ue_sched_ctl->dl_pow_off[CC_id] != 1)) {
for (j = 0; j < N_RBG[CC_id]; j += 2) { for (j = 0; j < N_RBG[CC_id]; j += 2) {
if ((((j == (N_RBG[CC_id] - 1)) if ((((j == (N_RBG[CC_id] - 1))
&& (rballoc_sub[CC_id][j] == 0) && (rballoc_sub[CC_id][j] == 0)
&& (ue_sched_ctl->
rballoc_sub_UE[CC_id][j] == 0))
|| ((j < (N_RBG[CC_id] - 1))
&& (rballoc_sub[CC_id][j + 1] == 0)
&&
(ue_sched_ctl->rballoc_sub_UE
[CC_id][j + 1] == 0)))
&& (nb_rbs_remaining[CC_id][UE_id]
> 0)) {
for (i = UE_list->next[UE_id + 1]; i >= 0;
i = UE_list->next[i]) {
UE_id2 = i;
rnti2 = UE_RNTI(Mod_id, UE_id2);
ue_sched_ctl2 =
&UE_list->UE_sched_ctrl[UE_id2];
round2 = ue_sched_ctl2->round[CC_id];
if (rnti2 == NOT_A_RNTI)
continue;
if (UE_list->
UE_sched_ctrl
[UE_id2].ul_out_of_sync == 1)
continue;
eNB_UE_stats2 =
UE_list->
eNB_UE_stats[CC_id][UE_id2];
//mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0);
if ((mac_eNB_get_rrc_status
(Mod_id,
rnti2) >= RRC_RECONFIGURED)
&& (round2 == 0)
&&
(get_tmode(Mod_id, CC_id, UE_id2)
== 5)
&& (ue_sched_ctl-> && (ue_sched_ctl->
rballoc_sub_UE[CC_id][j] == 0)) dl_pow_off[CC_id] != 1)) {
|| ((j < (N_RBG[CC_id] - 1))
&& (rballoc_sub[CC_id][j + 1] == 0) if ((((j == (N_RBG[CC_id] - 1))
&&
(ue_sched_ctl->rballoc_sub_UE
[CC_id][j + 1] == 0)))
&& (nb_rbs_required_remaining[CC_id][UE_id]
> 0)) {
for (i = UE_list->next[UE_id + 1]; i >= 0;
i = UE_list->next[i]) {
UE_id2 = i;
rnti2 = UE_RNTI(Mod_id, UE_id2);
ue_sched_ctl2 =
&UE_list->UE_sched_ctrl[UE_id2];
round2 = ue_sched_ctl2->round[CC_id];
if (rnti2 == NOT_A_RNTI)
continue;
if (UE_list->
UE_sched_ctrl
[UE_id2].ul_out_of_sync == 1)
continue;
eNB_UE_stats2 =
UE_list->
eNB_UE_stats[CC_id][UE_id2];
//mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0);
if ((mac_eNB_get_rrc_status
(Mod_id,
rnti2) >= RRC_RECONFIGURED)
&& (round2 == 0)
&&
(get_tmode(Mod_id, CC_id, UE_id2)
== 5)
&& (ue_sched_ctl->
dl_pow_off[CC_id] != 1)) {
if ((((j == (N_RBG[CC_id] - 1))
&&
(ue_sched_ctl->rballoc_sub_UE
[CC_id][j] == 0))
|| ((j < (N_RBG[CC_id] - 1))
&&
(ue_sched_ctl->
rballoc_sub_UE[CC_id][j +
1]
== 0)))
&& &&
(nb_rbs_required_remaining (ue_sched_ctl->rballoc_sub_UE
[CC_id] [CC_id][j] == 0))
[UE_id2] > 0)) { || ((j < (N_RBG[CC_id] - 1))
&&
if ((((eNB_UE_stats2-> (ue_sched_ctl->
DL_pmi_single ^ rballoc_sub_UE[CC_id][j +
eNB_UE_stats1-> 1]
DL_pmi_single) == 0)))
<< (14 - j)) & 0xc000) == 0x4000) { //MU-MIMO only for 25 RBs configuration &&
(nb_rbs_remaining
rballoc_sub[CC_id][j] = 1; [CC_id]
ue_sched_ctl-> [UE_id2] > 0)) {
rballoc_sub_UE[CC_id]
[j] = 1; if ((((eNB_UE_stats2->
ue_sched_ctl2-> DL_pmi_single ^
rballoc_sub_UE[CC_id] eNB_UE_stats1->
[j] = 1; DL_pmi_single)
MIMO_mode_indicator[CC_id] << (14 - j)) & 0xc000) == 0x4000) { //MU-MIMO only for 25 RBs configuration
[j] = 0;
rballoc_sub[CC_id][j] = 1;
if (j < N_RBG[CC_id] - 1) { ue_sched_ctl->
rballoc_sub[CC_id][j + rballoc_sub_UE[CC_id]
1] = [j] = 1;
1; ue_sched_ctl2->
ue_sched_ctl-> rballoc_sub_UE[CC_id]
rballoc_sub_UE [j] = 1;
[CC_id][j + 1] = 1; MIMO_mode_indicator[CC_id]
ue_sched_ctl2->rballoc_sub_UE [j] = 0;
[CC_id][j + 1] = 1;
MIMO_mode_indicator if (j < N_RBG[CC_id] - 1) {
[CC_id][j + 1] rballoc_sub[CC_id][j +
= 0; 1] =
} 1;
ue_sched_ctl->
ue_sched_ctl-> rballoc_sub_UE
dl_pow_off[CC_id] [CC_id][j + 1] = 1;
= 0; ue_sched_ctl2->rballoc_sub_UE
ue_sched_ctl2-> [CC_id][j + 1] = 1;
dl_pow_off[CC_id] MIMO_mode_indicator
= 0; [CC_id][j + 1]
= 0;
}
if ((j == N_RBG[CC_id] - 1)
&& ((N_RB_DL == 25) ue_sched_ctl->
|| (N_RB_DL == dl_pow_off[CC_id]
50))) { = 0;
ue_sched_ctl2->
nb_rbs_required_remaining dl_pow_off[CC_id]
[CC_id][UE_id] = = 0;
nb_rbs_required_remaining
[CC_id][UE_id] -
min_rb_unit[CC_id] if ((j == N_RBG[CC_id] - 1)
+ 1; && ((N_RB_DL == 25)
ue_sched_ctl->pre_nb_available_rbs || (N_RB_DL ==
[CC_id] = 50))) {
ue_sched_ctl->pre_nb_available_rbs
[CC_id] + nb_rbs_remaining
min_rb_unit[CC_id] [CC_id][UE_id] =
- 1; nb_rbs_remaining
nb_rbs_required_remaining [CC_id][UE_id] -
[CC_id][UE_id2] = min_rb_unit[CC_id]
nb_rbs_required_remaining + 1;
[CC_id][UE_id2] - ue_sched_ctl->pre_nb_available_rbs
min_rb_unit[CC_id] [CC_id] =
+ 1; ue_sched_ctl->pre_nb_available_rbs
ue_sched_ctl2->pre_nb_available_rbs [CC_id] +
[CC_id] = min_rb_unit[CC_id]
ue_sched_ctl2->pre_nb_available_rbs - 1;
[CC_id] + nb_rbs_remaining
min_rb_unit[CC_id] [CC_id][UE_id2] =
- 1; nb_rbs_remaining
} else { [CC_id][UE_id2] -
min_rb_unit[CC_id]
nb_rbs_required_remaining + 1;
[CC_id][UE_id] = ue_sched_ctl2->pre_nb_available_rbs
nb_rbs_required_remaining [CC_id] =
[CC_id][UE_id] - 4; ue_sched_ctl2->pre_nb_available_rbs
ue_sched_ctl->pre_nb_available_rbs [CC_id] +
[CC_id] = min_rb_unit[CC_id]
ue_sched_ctl->pre_nb_available_rbs - 1;
[CC_id] + 4; } else {
nb_rbs_required_remaining
[CC_id][UE_id2] = nb_rbs_remaining
nb_rbs_required_remaining [CC_id][UE_id] =
[CC_id][UE_id2] - nb_rbs_remaining
4; [CC_id][UE_id] - 4;
ue_sched_ctl2->pre_nb_available_rbs ue_sched_ctl->pre_nb_available_rbs
[CC_id] = [CC_id] =
ue_sched_ctl2->pre_nb_available_rbs ue_sched_ctl->pre_nb_available_rbs
[CC_id] + 4; [CC_id] + 4;
} nb_rbs_remaining
[CC_id][UE_id2] =
break; nb_rbs_remaining
} [CC_id][UE_id2] -
} 4;
} ue_sched_ctl2->pre_nb_available_rbs
} [CC_id] =
} ue_sched_ctl2->pre_nb_available_rbs
} [CC_id] + 4;
} }
break;
}
}
}
}
}
}
}
#endif #endif
} // total_ue_count } // total_ue_count
} // CC } // CC
...@@ -1146,7 +1129,6 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, ...@@ -1146,7 +1129,6 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) { for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) {
CC_id = UE_list->ordered_CCids[i][UE_id]; CC_id = UE_list->ordered_CCids[i][UE_id];
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id];
if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0) { if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0) {
LOG_D(MAC, "******************DL Scheduling Information for UE%d ************************\n", UE_id); LOG_D(MAC, "******************DL Scheduling Information for UE%d ************************\n", UE_id);
...@@ -1392,10 +1374,10 @@ dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, ...@@ -1392,10 +1374,10 @@ dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id,
int UE_id, int UE_id,
uint8_t CC_id, uint8_t CC_id,
int N_RBG, int N_RBG,
int transmission_mode, int tm,
int min_rb_unit, int min_rb_unit,
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
uint8_t slice_allocation_mask[MAX_NUM_CCs][N_RBG_MAX], uint8_t slice_allocation_mask[MAX_NUM_CCs][N_RBG_MAX],
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) {
...@@ -1407,51 +1389,38 @@ dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, ...@@ -1407,51 +1389,38 @@ dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id,
for (i = 0; i < N_RBG; i++) { for (i = 0; i < N_RBG; i++) {
if (rballoc_sub[CC_id][i] != 0) if (rballoc_sub[CC_id][i] != 0) continue;
continue; if (ue_sched_ctl->rballoc_sub_UE[CC_id][i] != 0) continue;
if (ue_sched_ctl->rballoc_sub_UE[CC_id][i] != 0) if (nb_rbs_remaining[CC_id][UE_id] <= 0) continue;
continue; if (ue_sched_ctl->pre_nb_available_rbs[CC_id] >= nb_rbs_required[CC_id][UE_id]) continue;
if (nb_rbs_required_remaining[CC_id][UE_id] <= 0) if (ue_sched_ctl->dl_pow_off[CC_id] == 0) continue;
continue; if (slice_allocation_mask[CC_id][i] == 0) continue;
if (ue_sched_ctl->pre_nb_available_rbs[CC_id] >= nb_rbs_required[CC_id][UE_id])
continue;
if (ue_sched_ctl->dl_pow_off[CC_id] == 0)
continue;
if (slice_allocation_mask[CC_id][i] == 0)
continue;
// if ((rballoc_sub[CC_id][i] == 0) &&
// (ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) &&
// (nb_rbs_required_remaining[CC_id][UE_id] > 0) &&
// (ue_sched_ctl->pre_nb_available_rbs[CC_id] < nb_rbs_required[CC_id][UE_id])) {
// // if this UE is not scheduled for TM5
// if (ue_sched_ctl->dl_pow_off[CC_id] != 0) {
if ((i == N_RBG - 1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) { if ((i == N_RBG - 1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) {
if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit - 1) { // Allocating last, smaller RBG
if (nb_rbs_remaining[CC_id][UE_id] >= min_rb_unit - 1) {
rballoc_sub[CC_id][i] = 1; rballoc_sub[CC_id][i] = 1;
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1;
MIMO_mode_indicator[CC_id][i] = 1; MIMO_mode_indicator[CC_id][i] = 1;
if (transmission_mode == 5) { if (tm == 5) {
ue_sched_ctl->dl_pow_off[CC_id] = 1; ue_sched_ctl->dl_pow_off[CC_id] = 1;
} }
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit + 1; nb_rbs_remaining[CC_id][UE_id] = nb_rbs_remaining[CC_id][UE_id] - min_rb_unit + 1;
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1; ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1;
} }
} else { } else {
if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit) { // Allocating a standard-sized RBG
if (nb_rbs_remaining[CC_id][UE_id] >= min_rb_unit) {
rballoc_sub[CC_id][i] = 1; rballoc_sub[CC_id][i] = 1;
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1;
MIMO_mode_indicator[CC_id][i] = 1; MIMO_mode_indicator[CC_id][i] = 1;
if (transmission_mode == 5) { if (tm == 5) {
ue_sched_ctl->dl_pow_off[CC_id] = 1; ue_sched_ctl->dl_pow_off[CC_id] = 1;
} }
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit; nb_rbs_remaining[CC_id][UE_id] = nb_rbs_remaining[CC_id][UE_id] - min_rb_unit;
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit; ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit;
} }
} }
// } // dl_pow_off[CC_id][UE_id] ! = 0
// }
} }
} }
...@@ -1548,7 +1517,8 @@ ulsch_scheduler_pre_processor(module_id_t module_idP, ...@@ -1548,7 +1517,8 @@ ulsch_scheduler_pre_processor(module_id_t module_idP,
N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth); N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth);
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_id] = flexran_nb_rbs_allowed_slice(slice_percentage_uplink[slice_id],N_RB_UL); ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_id] =
nb_rbs_allowed_slice(slice_percentage_uplink[slice_id], N_RB_UL);
if (total_ue_count[CC_id] == 0) { if (total_ue_count[CC_id] == 0) {
average_rbs_per_user[CC_id] = 0; average_rbs_per_user[CC_id] = 0;
...@@ -1738,7 +1708,8 @@ assign_max_mcs_min_rb(module_id_t module_idP, int slice_id, int frameP, ...@@ -1738,7 +1708,8 @@ assign_max_mcs_min_rb(module_id_t module_idP, int slice_id, int frameP,
Ncp = RC.mac[module_idP]->common_channels[CC_id].Ncp; Ncp = RC.mac[module_idP]->common_channels[CC_id].Ncp;
N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth); N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth);
ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_id] = flexran_nb_rbs_allowed_slice(slice_percentage_uplink[slice_id],N_RB_UL); ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_id] =
nb_rbs_allowed_slice(slice_percentage_uplink[slice_id], N_RB_UL);
int bytes_to_schedule = UE_template->estimated_ul_buffer - UE_template->scheduled_ul_bytes; int bytes_to_schedule = UE_template->estimated_ul_buffer - UE_template->scheduled_ul_bytes;
if (bytes_to_schedule < 0) bytes_to_schedule = 0; if (bytes_to_schedule < 0) bytes_to_schedule = 0;
......
...@@ -238,7 +238,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id, ...@@ -238,7 +238,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
int min_rb_unit[MAX_NUM_CCs], int min_rb_unit[MAX_NUM_CCs],
uint8_t total_ue_count[MAX_NUM_CCs], uint8_t total_ue_count[MAX_NUM_CCs],
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]); uint16_t nb_rbs_accounted[MAX_NUM_CCs][NUMBER_OF_UE_MAX]);
void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
slice_id_t slice_id, slice_id_t slice_id,
...@@ -246,7 +246,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id, ...@@ -246,7 +246,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
int min_rb_unit[MAX_NUM_CCs], int min_rb_unit[MAX_NUM_CCs],
uint8_t total_ue_count[MAX_NUM_CCs], uint8_t total_ue_count[MAX_NUM_CCs],
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_accounted[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
uint8_t rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], uint8_t rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
uint8_t MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); uint8_t MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]);
...@@ -1193,8 +1193,7 @@ int l2_init_ue(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ...@@ -1193,8 +1193,7 @@ int l2_init_ue(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,
uint8_t HO_active); uint8_t HO_active);
/*Slice related functions */ /*Slice related functions */
uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs); uint16_t nb_rbs_allowed_slice(float rb_percentage, int total_rbs);
int ue_slice_membership(int UE_id, int slice_id); int ue_slice_membership(int UE_id, int slice_id);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment