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
Michael Black
OpenXG-RAN
Commits
8d9a8ab5
Commit
8d9a8ab5
authored
Mar 13, 2018
by
Niccolò Iardella
Committed by
Robert Schmidt
Sep 03, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add UE sorting on LCID priority
parent
5634aa92
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
132 additions
and
26 deletions
+132
-26
openair2/COMMON/platform_types.h
openair2/COMMON/platform_types.h
+2
-1
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+88
-16
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
+8
-4
openair2/LAYER2/MAC/mac_proto.h
openair2/LAYER2/MAC/mac_proto.h
+6
-0
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+28
-5
No files found.
openair2/COMMON/platform_types.h
View file @
8d9a8ab5
...
...
@@ -110,7 +110,8 @@ typedef enum {
CR_HOL
=
2
,
CR_LC
=
3
,
CR_CQI
=
4
,
CR_NUM
=
5
CR_LCP
=
5
,
CR_NUM
=
6
}
sorting_criterion_t
;
//-----------------------------------------------------------------------------
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
8d9a8ab5
...
...
@@ -70,6 +70,7 @@ extern RAN_CONTEXT_t RC;
extern
uint8_t
nfapi_mode
;
extern
pre_processor_results_t
pre_processor_results
[
MAX_NUM_SLICES
];
extern
int
slice_isolation
[
MAX_NUM_SLICES
];
extern
int
slice_priority
[
MAX_NUM_SLICES
];
//------------------------------------------------------------------------------
void
...
...
@@ -534,23 +535,44 @@ schedule_dlsch(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, in
}
// Check for new sorting policy
if
(
slice_sorting_
policy_current
[
i
]
!=
slice_sorting_policy
[
i
])
{
if
(
slice_sorting_
current
[
i
]
!=
slice_sorting
[
i
])
{
LOG_I
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: UE sorting policy has changed (%x-->%x)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_sorting_policy_current
[
i
],
slice_sorting_policy
[
i
]);
slice_sorting_policy_current
[
i
]
=
slice_sorting_policy
[
i
];
module_idP
,
i
,
frameP
,
subframeP
,
slice_sorting_current
[
i
],
slice_sorting
[
i
]);
slice_sorting_current
[
i
]
=
slice_sorting
[
i
];
}
// Check for new slice isolation
if
(
slice_isolation_current
[
i
]
!=
slice_isolation
[
i
])
{
if
(
slice_isolation
[
i
]
!=
1
&&
slice_isolation
[
i
]
!=
0
)
{
LOG_W
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: invalid slice isolation setting (%d), revert to its previous value (%d)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_isolation
[
i
],
slice_isolation_current
[
i
]);
slice_isolation
[
i
]
=
slice_isolation_current
[
i
];
}
else
{
LOG_I
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: slice isolation setting has changed (%x-->%x)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_isolation_current
[
i
],
slice_isolation
[
i
]);
slice_isolation_current
[
i
]
=
slice_isolation
[
i
];
}
}
// Check for new slice priority
if
(
slice_priority_current
[
i
]
!=
slice_priority
[
i
])
{
LOG_I
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: slice priority setting has changed (%x-->%x)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_priority_current
[
i
],
slice_priority
[
i
]);
slice_priority_current
[
i
]
=
slice_priority
[
i
];
}
// Check for new accounting policy
if
(
slice_accounting_
policy_current
[
i
]
!=
slice_accounting_policy
[
i
])
{
if
(
slice_accounting
_policy
[
i
]
>
1
||
slice_accounting_policy
[
i
]
<
0
)
{
if
(
slice_accounting_
current
[
i
]
!=
slice_accounting
[
i
])
{
if
(
slice_accounting
[
i
]
>
1
||
slice_accounting
[
i
]
<
0
)
{
LOG_W
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: invalid accounting policy (%d), revert to its previous value (%d)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_accounting
_policy
[
i
],
slice_accounting_policy
_current
[
i
]);
slice_accounting
_policy
[
i
]
=
slice_accounting_policy
_current
[
i
];
module_idP
,
i
,
frameP
,
subframeP
,
slice_accounting
[
i
],
slice_accounting
_current
[
i
]);
slice_accounting
[
i
]
=
slice_accounting
_current
[
i
];
}
else
{
LOG_N
(
MAC
,
"[eNB %d][SLICE %d][DL] frame %d subframe %d: UE sorting policy has changed (%x-->%x)
\n
"
,
module_idP
,
i
,
frameP
,
subframeP
,
slice_accounting_
policy_current
[
i
],
slice_accounting_policy
[
i
]);
slice_accounting_
policy_current
[
i
]
=
slice_accounting_policy
[
i
];
module_idP
,
i
,
frameP
,
subframeP
,
slice_accounting_
current
[
i
],
slice_accounting
[
i
]);
slice_accounting_
current
[
i
]
=
slice_accounting
[
i
];
}
}
...
...
@@ -1570,6 +1592,7 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, int frameP, sub
COMMON_channels_t
*
cc
;
int
N_RBG
[
NFAPI_CC_MAX
];
int
slice_sorted_list
[
MAX_NUM_SLICES
],
slice_id
;
int8_t
free_rbgs_map
[
NFAPI_CC_MAX
][
N_RBG_MAX
];
int
has_traffic
[
NFAPI_CC_MAX
][
MAX_NUM_SLICES
];
uint8_t
allocation_mask
[
NFAPI_CC_MAX
][
N_RBG_MAX
];
...
...
@@ -1613,7 +1636,7 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, int frameP, sub
}
}
// TODO: Sort slices by priority and use the sorted list in the code below (For now we assume 0 = max_priority)
slice_priority_sort
(
slice_sorted_list
);
// MULTIPLEXING
// This part is an adaptation of dlsch_scheduler_pre_processor_allocate() code
...
...
@@ -1623,8 +1646,9 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, int frameP, sub
min_rb_unit
=
get_min_rb_unit
(
Mod_id
,
CC_id
);
for
(
i
=
0
;
i
<
n_active_slices
;
++
i
)
{
slice_id
=
slice_sorted_list
[
i
];
if
(
has_traffic
[
CC_id
][
i
]
==
0
)
continue
;
if
(
has_traffic
[
CC_id
][
slice_id
]
==
0
)
continue
;
// Build an ad-hoc allocation mask fo the slice
for
(
rbg
=
0
;
rbg
<
N_RBG
[
CC_id
];
++
rbg
)
{
...
...
@@ -1644,12 +1668,13 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, int frameP, sub
// Sort UE again
// (UE list gets sorted every time pre_processor is called so it is probably dirty at this point)
sort_UEs
(
Mod_id
,
(
slice_id_t
)
i
,
frameP
,
subframeP
);
// FIXME: There is only one UE_list for all slices, so it must be sorted again each time we use it
sort_UEs
(
Mod_id
,
(
slice_id_t
)
slice_id
,
frameP
,
subframeP
);
nb_rbs_remaining
=
pre_processor_results
[
i
].
nb_rbs_remaining
;
nb_rbs_required
=
pre_processor_results
[
i
].
nb_rbs_required
;
rballoc_sub
=
pre_processor_results
[
i
].
slice_allocated_rbgs
;
MIMO_mode_indicator
=
pre_processor_results
[
i
].
MIMO_mode_indicator
;
nb_rbs_remaining
=
pre_processor_results
[
slice_id
].
nb_rbs_remaining
;
nb_rbs_required
=
pre_processor_results
[
slice_id
].
nb_rbs_required
;
rballoc_sub
=
pre_processor_results
[
slice_id
].
slice_allocated_rbgs
;
MIMO_mode_indicator
=
pre_processor_results
[
slice_id
].
MIMO_mode_indicator
;
// Allocation
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
...
...
@@ -1699,6 +1724,32 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, int frameP, sub
}
}
//------------------------------------------------------------------------------
void
dlsch_scheduler_qos_multiplexing
(
module_id_t
Mod_id
,
int
frameP
,
sub_frame_t
subframeP
)
//------------------------------------------------------------------------------
{
int
UE_id
,
CC_id
,
i
;
UE_list_t
*
UE_list
=
&
RC
.
mac
[
Mod_id
]
->
UE_list
;
UE_sched_ctrl
*
ue_sched_ctl
;
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
++
CC_id
)
{
for
(
i
=
0
;
i
<
n_active_slices
;
++
i
)
{
// Sort UE again
// FIXME: There is only one UE_list for all slices, so it must be sorted again each time we use it
sort_UEs
(
Mod_id
,
(
slice_id_t
)
i
,
frameP
,
subframeP
);
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
// TODO: Do something here
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
];
}
}
}
}
//------------------------------------------------------------------------------
void
fill_DLSCH_dci
(
module_id_t
module_idP
,
...
...
@@ -2252,3 +2303,24 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
stop_meas
(
&
eNB
->
schedule_pch
);
return
;
}
static
int
slice_priority_compare
(
const
void
*
_a
,
const
void
*
_b
)
{
int
slice_id1
=
*
(
const
int
*
)
_a
;
int
slice_id2
=
*
(
const
int
*
)
_b
;
if
(
slice_priority
[
slice_id1
]
>
slice_priority
[
slice_id2
])
{
return
-
1
;
}
return
1
;
}
void
slice_priority_sort
(
int
slice_list
[
MAX_NUM_SLICES
])
{
int
i
;
for
(
i
=
0
;
i
<
MAX_NUM_SLICES
;
++
i
)
{
slice_list
[
i
]
=
i
;
}
qsort
(
slice_list
,
MAX_NUM_SLICES
,
sizeof
(
int
),
slice_priority_compare
);
}
openair2/LAYER2/MAC/eNB_scheduler_dlsch.h
View file @
8d9a8ab5
...
...
@@ -48,7 +48,11 @@ float slice_percentage_current[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0};
float
slice_percentage_total
=
0
;
float
slice_percentage_total_current
=
0
;
float
slice_percentage_avg
=
0
.
25
;
int
slice_isolation
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
slice_isolation_current
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
slice_priority
[
MAX_NUM_SLICES
]
=
{
10
,
5
,
2
,
0
};
int
slice_priority_current
[
MAX_NUM_SLICES
]
=
{
10
,
5
,
2
,
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
};
...
...
@@ -59,12 +63,12 @@ int slice_maxmcs[MAX_NUM_SLICES] = { 28, 28, 28, 28 };
int
slice_maxmcs_current
[
MAX_NUM_SLICES
]
=
{
28
,
28
,
28
,
28
};
// The lists of criteria that enforce the sorting policies of the slices
uint32_t
slice_sorting
_policy
[
MAX_NUM_SLICES
]
=
{
0x01234
,
0x01234
,
0x01234
,
0x01234
};
uint32_t
slice_sorting_
policy_current
[
MAX_NUM_SLICES
]
=
{
0x01234
,
0x01234
,
0x01234
,
0x01234
};
uint32_t
slice_sorting
[
MAX_NUM_SLICES
]
=
{
0x012345
,
0x012345
,
0x012345
,
0x012345
};
uint32_t
slice_sorting_
current
[
MAX_NUM_SLICES
]
=
{
0x012345
,
0x012345
,
0x012345
,
0x012345
};
// Accounting policy (just greedy(1) or fair(0) setting for now)
int
slice_accounting
_policy
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
slice_accounting_
policy_
current
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
slice_accounting
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
slice_accounting_current
[
MAX_NUM_SLICES
]
=
{
0
,
0
,
0
,
0
};
int
update_dl_scheduler
[
MAX_NUM_SLICES
]
=
{
1
,
1
,
1
,
1
};
int
update_dl_scheduler_current
[
MAX_NUM_SLICES
]
=
{
1
,
1
,
1
,
1
};
...
...
openair2/LAYER2/MAC/mac_proto.h
View file @
8d9a8ab5
...
...
@@ -260,10 +260,16 @@ void dlsch_scheduler_pre_processor_intraslice_sharing(module_id_t Mod_id,
uint8_t
rballoc_sub
[
NFAPI_CC_MAX
][
N_RBG_MAX
],
uint8_t
MIMO_mode_indicator
[
NFAPI_CC_MAX
][
N_RBG_MAX
]);
void
slice_priority_sort
(
int
slice_list
[
MAX_NUM_SLICES
]);
void
dlsch_scheduler_interslice_multiplexing
(
module_id_t
Mod_id
,
int
frameP
,
sub_frame_t
subframeP
);
void
dlsch_scheduler_qos_multiplexing
(
module_id_t
Mod_id
,
int
frameP
,
sub_frame_t
subframeP
);
void
dlsch_scheduler_pre_processor_allocate
(
module_id_t
Mod_id
,
int
UE_id
,
uint8_t
CC_id
,
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
8d9a8ab5
...
...
@@ -57,8 +57,8 @@ extern RAN_CONTEXT_t RC;
extern
float
slice_percentage
[
MAX_NUM_SLICES
];
extern
float
slice_percentage_uplink
[
MAX_NUM_SLICES
];
extern
int
slice_position
[
MAX_NUM_SLICES
*
2
];
extern
uint32_t
slice_sorting
_policy
[
MAX_NUM_SLICES
];
extern
int
slice_accounting
_policy
[
MAX_NUM_SLICES
];
extern
uint32_t
slice_sorting
[
MAX_NUM_SLICES
];
extern
int
slice_accounting
[
MAX_NUM_SLICES
];
extern
int
slice_maxmcs
[
MAX_NUM_SLICES
];
extern
int
slice_maxmcs_uplink
[
MAX_NUM_SLICES
];
extern
pre_processor_results_t
pre_processor_results
[
MAX_NUM_SLICES
];
...
...
@@ -315,6 +315,20 @@ int maxcqi(module_id_t Mod_id, int32_t UE_id) {
return
CQI
;
}
long
min_lcgidpriority
(
module_id_t
Mod_id
,
int32_t
UE_id
)
{
UE_list_t
*
UE_list
=
&
RC
.
mac
[
Mod_id
]
->
UE_list
;
int
i
;
int
pCC_id
=
UE_PCCID
(
Mod_id
,
UE_id
);
long
ret
=
UE_list
->
UE_template
[
pCC_id
][
UE_id
].
lcgidpriority
[
0
];
for
(
i
=
1
;
i
<
11
;
++
i
)
{
if
(
UE_list
->
UE_template
[
pCC_id
][
UE_id
].
lcgidpriority
[
i
]
<
ret
)
ret
=
UE_list
->
UE_template
[
pCC_id
][
UE_id
].
lcgidpriority
[
i
];
}
return
ret
;
}
struct
sort_ue_dl_params
{
int
Mod_idP
;
int
frameP
;
...
...
@@ -343,6 +357,9 @@ static int ue_dl_compare(const void *_a, const void *_b, void *_params)
int
cqi1
=
maxcqi
(
params
->
Mod_idP
,
UE_id1
);
int
cqi2
=
maxcqi
(
params
->
Mod_idP
,
UE_id2
);
long
lcgid1
=
min_lcgidpriority
(
params
->
Mod_idP
,
UE_id1
);
long
lcgid2
=
min_lcgidpriority
(
params
->
Mod_idP
,
UE_id2
);
for
(
i
=
0
;
i
<
CR_NUM
;
++
i
)
{
switch
(
UE_list
->
sorting_criteria
[
slice_id
][
i
])
{
...
...
@@ -390,6 +407,12 @@ static int ue_dl_compare(const void *_a, const void *_b, void *_params)
if
(
cqi1
<
cqi2
)
return
1
;
case
CR_LCP
:
if
(
lcgid1
<
lcgid2
)
return
-
1
;
if
(
lcgid1
>
lcgid2
)
return
1
;
default
:
break
;
}
...
...
@@ -402,7 +425,7 @@ void decode_sorting_policy(module_id_t Mod_idP, slice_id_t slice_id) {
int
i
;
UE_list_t
*
UE_list
=
&
RC
.
mac
[
Mod_idP
]
->
UE_list
;
uint32_t
policy
=
slice_sorting
_policy
[
slice_id
];
uint32_t
policy
=
slice_sorting
[
slice_id
];
uint32_t
mask
=
0x0000000F
;
uint16_t
criterion
;
...
...
@@ -410,7 +433,7 @@ void decode_sorting_policy(module_id_t Mod_idP, slice_id_t slice_id) {
criterion
=
(
uint16_t
)
(
policy
>>
4
*
(
CR_NUM
-
1
-
i
)
&
mask
);
if
(
criterion
>=
CR_NUM
)
{
LOG_W
(
MAC
,
"Invalid criterion in slice %d policy, revert to default policy
\n
"
,
slice_id
);
slice_sorting
_policy
[
slice_id
]
=
0x1234
;
slice_sorting
[
slice_id
]
=
0x1234
;
break
;
}
UE_list
->
sorting_criteria
[
slice_id
][
i
]
=
criterion
;
...
...
@@ -649,7 +672,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
// Reduces the available RBs according to slicing configuration
dlsch_scheduler_pre_processor_partitioning
(
Mod_id
,
slice_id
,
rbs_retx
);
switch
(
slice_accounting
_policy
[
slice_id
])
{
switch
(
slice_accounting
[
slice_id
])
{
// If greedy scheduling, try to account all the required RBs
case
1
:
...
...
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