Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
canghaiwuhen
OpenXG-RAN
Commits
22348335
Commit
22348335
authored
Feb 23, 2018
by
Niccolò Iardella
Committed by
Robert Schmidt
Apr 18, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move slicing configuration variables in header files
parent
361af123
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
376 additions
and
327 deletions
+376
-327
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+1
-38
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
+77
-0
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+1
-1
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+1
-33
openair2/LAYER2/MAC/eNB_scheduler_ulsch.h
openair2/LAYER2/MAC/eNB_scheduler_ulsch.h
+71
-0
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+222
-251
openair2/LAYER2/MAC/proto.h
openair2/LAYER2/MAC/proto.h
+3
-4
No files found.
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
22348335
...
...
@@ -49,6 +49,7 @@
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
//#include "LAYER2/MAC/pre_processor.c"
#include "eNB_scheduler_dlsch.h"
#include "pdcp.h"
#include "SIMULATION/TOOLS/defs.h" // for taus
...
...
@@ -71,44 +72,6 @@
extern
RAN_CONTEXT_t
RC
;
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
add_ue_dlsch_info
(
module_id_t
module_idP
,
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
0 → 100644
View file @
22348335
/*
* 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__
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
View file @
22348335
...
...
@@ -4135,7 +4135,7 @@ harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP,
// 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
);
}
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
View file @
22348335
...
...
@@ -51,6 +51,7 @@
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
//#include "LAYER2/MAC/pre_processor.c"
#include "eNB_scheduler_ulsch.h"
#include "pdcp.h"
#if defined(ENABLE_ITTI)
...
...
@@ -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
uint8_t
nfapi_mode
;
extern
uint8_t
nfapi_mode
;
// This table holds the allowable PRB sizes for ULSCH transmissions
uint8_t
rb_table
[
34
]
=
{
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
};
/* 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
rx_sdu
(
const
module_id_t
enb_mod_idP
,
const
int
CC_idP
,
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.h
0 → 100644
View file @
22348335
/*
* 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__
openair2/LAYER2/MAC/pre_processor.c
View file @
22348335
...
...
@@ -268,7 +268,8 @@ assign_rbs_required(module_id_t Mod_id,
to_prb
(
RC
.
mac
[
Mod_id
]
->
common_channels
[
CC_id
].
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 */
while
(
TBS
<
...
...
@@ -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
void
sort_UEs
(
module_id_t
Mod_idP
,
slice_id_t
slice_id
,
int
frameP
,
sub_frame_t
subframeP
)
{
int
i
;
int
list
[
NUMBER_OF_UE_MAX
];
int
list_size
=
0
;
int
rnti
;
struct
sort_ue_dl_params
params
=
{
Mod_idP
,
frameP
,
subframeP
,
slice_id
};
void
sort_UEs
(
module_id_t
Mod_idP
,
slice_id_t
slice_id
,
int
frameP
,
sub_frame_t
subframeP
)
{
int
i
;
int
list
[
NUMBER_OF_UE_MAX
];
int
list_size
=
0
;
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
)
continue
;
if
((
rnti
=
UE_RNTI
(
Mod_idP
,
i
))
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
i
].
ul_out_of_sync
==
1
)
continue
;
if
(
!
ue_slice_membership
(
i
,
slice_id
))
continue
;
if
(
UE_list
->
active
[
i
]
==
FALSE
)
continue
;
if
(
UE_RNTI
(
Mod_idP
,
i
)
==
NOT_A_RNTI
)
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_size
++
;
}
list
[
list_size
]
=
i
;
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
)
{
for
(
i
=
0
;
i
<
list_size
-
1
;
i
++
)
UE_list
->
next
[
list
[
i
]]
=
list
[
i
+
1
];
UE_list
->
next
[
list
[
list_size
-
1
]]
=
-
1
;
UE_list
->
head
=
list
[
0
];
}
else
{
UE_list
->
head
=
-
1
;
}
if
(
list_size
)
{
for
(
i
=
0
;
i
<
list_size
-
1
;
++
i
)
UE_list
->
next
[
list
[
i
]]
=
list
[
i
+
1
];
UE_list
->
next
[
list
[
list_size
-
1
]]
=
-
1
;
UE_list
->
head
=
list
[
0
];
}
else
{
UE_list
->
head
=
-
1
;
}
#if 0
...
...
@@ -622,7 +617,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
int
min_rb_unit
[
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_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,
average_rbs_per_user
[
CC_id
]
=
0
;
}
//
loop over all active UE
s
//
Find total UE count, and account the RBs required for retransmission
s
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
rnti
=
UE_RNTI
(
Mod_id
,
UE_id
);
if
(
rnti
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
==
1
)
continue
;
if
(
!
ue_slice_membership
(
UE_id
,
slice_id
))
continue
;
if
(
rnti
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
==
1
)
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
];
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_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,
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
rnti
=
UE_RNTI
(
Mod_id
,
UE_id
);
if
(
rnti
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
==
1
)
continue
;
if
(
!
ue_slice_membership
(
UE_id
,
slice_id
))
continue
;
if
(
rnti
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
==
1
)
continue
;
if
(
!
ue_slice_membership
(
UE_id
,
slice_id
))
continue
;
for
(
i
=
0
;
i
<
UE_num_active_CC
(
UE_list
,
UE_id
);
i
++
)
{
CC_id
=
UE_list
->
ordered_CCids
[
i
][
UE_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
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
ue_sched_ctl
->
max_rbs_allowed_slice
[
CC_id
][
slice_id
]
=
flexran_nb_rbs_allowed_slice
(
slice_percentage
[
slice_id
],
N_RB_DL
);
ue_sched_ctl
->
max_rbs_allowed_slice
[
CC_id
][
slice_id
]
=
nb_rbs_allowed_slice
(
slice_percentage
[
slice_id
],
N_RB_DL
);
if
(
total_ue_count
[
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,
(
ue_sched_ctl
->
max_rbs_allowed_slice
[
CC_id
][
slice_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
]);
}
else
{
// consider the total number of use that can be scheduled UE
}
else
{
// consider the total number of use that can be scheduled UE
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,
// control channel or retransmission
/* TODO: do we have to check for retransmission? */
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
{
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,
int
min_rb_unit
[
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_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
MIMO_mode_indicator
[
MAX_NUM_CCs
][
N_RBG_MAX
])
{
...
...
@@ -793,11 +781,11 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
if
(
r1
==
0
)
{
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
nb_rbs_required_remaining
[
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
];
if
(
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
<
0
)
abort
();
...
...
@@ -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
"
,
r1
,
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
],
UE_list
->
UE_sched_ctrl
[
UE_id
].
pre_nb_available_rbs
[
CC_id
],
N_RBG
[
CC_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
];
// if there are UEs with traffic
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
);
...
...
@@ -838,9 +824,6 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
continue
;
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
// control channel in the 1st transmission
...
...
@@ -859,166 +842,166 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
MIMO_mode_indicator
);
#ifdef TM5
// data chanel TM5: to be revisited
if
((
round
==
0
)
&&
(
transmission_mode
==
5
)
&&
(
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
!=
1
))
{
for
(
j
=
0
;
j
<
N_RBG
[
CC_id
];
j
+=
2
)
{
if
((((
j
==
(
N_RBG
[
CC_id
]
-
1
))
&&
(
rballoc_sub
[
CC_id
][
j
]
==
0
)
// data chanel TM5: to be revisited
if
((
round
==
0
)
&&
(
transmission_mode
==
5
)
&&
(
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
!=
1
))
{
for
(
j
=
0
;
j
<
N_RBG
[
CC_id
];
j
+=
2
)
{
if
((((
j
==
(
N_RBG
[
CC_id
]
-
1
))
&&
(
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
->
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_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
)))
dl_pow_off
[
CC_id
]
!=
1
))
{
if
((((
j
==
(
N_RBG
[
CC_id
]
-
1
))
&&
(
nb_rbs_required_remaining
[
CC_id
]
[
UE_id2
]
>
0
))
{
if
((((
eNB_UE_stats2
->
DL_pmi_single
^
eNB_UE_stats1
->
DL_pmi_single
)
<<
(
14
-
j
))
&
0xc000
)
==
0x4000
)
{
//MU-MIMO only for 25 RBs configuration
rballoc_sub
[
CC_id
][
j
]
=
1
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
]
[
j
]
=
1
;
ue_sched_ctl2
->
rballoc_sub_UE
[
CC_id
]
[
j
]
=
1
;
MIMO_mode_indicator
[
CC_id
]
[
j
]
=
0
;
if
(
j
<
N_RBG
[
CC_id
]
-
1
)
{
rballoc_sub
[
CC_id
][
j
+
1
]
=
1
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
j
+
1
]
=
1
;
ue_sched_ctl2
->
rballoc_sub_UE
[
CC_id
][
j
+
1
]
=
1
;
MIMO_mode_indicator
[
CC_id
][
j
+
1
]
=
0
;
}
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
=
0
;
ue_sched_ctl2
->
dl_pow_off
[
CC_id
]
=
0
;
if
((
j
==
N_RBG
[
CC_id
]
-
1
)
&&
((
N_RB_DL
==
25
)
||
(
N_RB_DL
==
50
)))
{
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
-
min_rb_unit
[
CC_id
]
+
1
;
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
+
min_rb_unit
[
CC_id
]
-
1
;
nb_rbs_required_remaining
[
CC_id
][
UE_id2
]
=
nb_rbs_required_remaining
[
CC_id
][
UE_id2
]
-
min_rb_unit
[
CC_id
]
+
1
;
ue_sched_ctl2
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl2
->
pre_nb_available_rbs
[
CC_id
]
+
min_rb_unit
[
CC_id
]
-
1
;
}
else
{
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
-
4
;
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
+
4
;
nb_rbs_required_remaining
[
CC_id
][
UE_id2
]
=
nb_rbs_required_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
;
}
}
}
}
}
}
}
(
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_remaining
[
CC_id
]
[
UE_id2
]
>
0
))
{
if
((((
eNB_UE_stats2
->
DL_pmi_single
^
eNB_UE_stats1
->
DL_pmi_single
)
<<
(
14
-
j
))
&
0xc000
)
==
0x4000
)
{
//MU-MIMO only for 25 RBs configuration
rballoc_sub
[
CC_id
][
j
]
=
1
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
]
[
j
]
=
1
;
ue_sched_ctl2
->
rballoc_sub_UE
[
CC_id
]
[
j
]
=
1
;
MIMO_mode_indicator
[
CC_id
]
[
j
]
=
0
;
if
(
j
<
N_RBG
[
CC_id
]
-
1
)
{
rballoc_sub
[
CC_id
][
j
+
1
]
=
1
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
j
+
1
]
=
1
;
ue_sched_ctl2
->
rballoc_sub_UE
[
CC_id
][
j
+
1
]
=
1
;
MIMO_mode_indicator
[
CC_id
][
j
+
1
]
=
0
;
}
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
=
0
;
ue_sched_ctl2
->
dl_pow_off
[
CC_id
]
=
0
;
if
((
j
==
N_RBG
[
CC_id
]
-
1
)
&&
((
N_RB_DL
==
25
)
||
(
N_RB_DL
==
50
)))
{
nb_rbs_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_remaining
[
CC_id
][
UE_id
]
-
min_rb_unit
[
CC_id
]
+
1
;
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
+
min_rb_unit
[
CC_id
]
-
1
;
nb_rbs_remaining
[
CC_id
][
UE_id2
]
=
nb_rbs_remaining
[
CC_id
][
UE_id2
]
-
min_rb_unit
[
CC_id
]
+
1
;
ue_sched_ctl2
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl2
->
pre_nb_available_rbs
[
CC_id
]
+
min_rb_unit
[
CC_id
]
-
1
;
}
else
{
nb_rbs_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_remaining
[
CC_id
][
UE_id
]
-
4
;
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
=
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
+
4
;
nb_rbs_remaining
[
CC_id
][
UE_id2
]
=
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
}
// total_ue_count
}
// CC
...
...
@@ -1146,7 +1129,6 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
for
(
i
=
0
;
i
<
UE_num_active_CC
(
UE_list
,
UE_id
);
i
++
)
{
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
)
{
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,
int
UE_id
,
uint8_t
CC_id
,
int
N_RBG
,
int
t
ransmission_mode
,
int
t
m
,
int
min_rb_unit
,
uint16_t
nb_rbs_required
[
MAX_NUM_CCs
][
NUMBER_OF_UE_MAX
],
uint16_t
nb_rbs_re
quired_re
maining
[
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
],
uint8_t
slice_allocation_mask
[
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,
for
(
i
=
0
;
i
<
N_RBG
;
i
++
)
{
if
(
rballoc_sub
[
CC_id
][
i
]
!=
0
)
continue
;
if
(
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
i
]
!=
0
)
continue
;
if
(
nb_rbs_required_remaining
[
CC_id
][
UE_id
]
<=
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
(
rballoc_sub
[
CC_id
][
i
]
!=
0
)
continue
;
if
(
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
i
]
!=
0
)
continue
;
if
(
nb_rbs_remaining
[
CC_id
][
UE_id
]
<=
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
((
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
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
i
]
=
1
;
MIMO_mode_indicator
[
CC_id
][
i
]
=
1
;
if
(
t
ransmission_mode
==
5
)
{
if
(
t
m
==
5
)
{
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
=
1
;
}
nb_rbs_re
quired_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_required
_remaining
[
CC_id
][
UE_id
]
-
min_rb_unit
+
1
;
nb_rbs_re
maining
[
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
;
}
}
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
;
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
i
]
=
1
;
MIMO_mode_indicator
[
CC_id
][
i
]
=
1
;
if
(
t
ransmission_mode
==
5
)
{
if
(
t
m
==
5
)
{
ue_sched_ctl
->
dl_pow_off
[
CC_id
]
=
1
;
}
nb_rbs_re
quired_remaining
[
CC_id
][
UE_id
]
=
nb_rbs_required
_remaining
[
CC_id
][
UE_id
]
-
min_rb_unit
;
nb_rbs_re
maining
[
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
;
}
}
// } // dl_pow_off[CC_id][UE_id] ! = 0
// }
}
}
...
...
@@ -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
);
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
)
{
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,
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
);
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
;
if
(
bytes_to_schedule
<
0
)
bytes_to_schedule
=
0
;
...
...
openair2/LAYER2/MAC/proto.h
View file @
22348335
...
...
@@ -238,7 +238,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
int
min_rb_unit
[
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_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
,
slice_id_t
slice_id
,
...
...
@@ -246,7 +246,7 @@ void dlsch_scheduler_pre_processor_positioning(module_id_t Mod_id,
int
min_rb_unit
[
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_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
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,
uint8_t
HO_active
);
/*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
);
#endif
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment