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
wangjie
OpenXG-RAN
Commits
53eb43ba
Commit
53eb43ba
authored
Feb 21, 2021
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename FR1 preprocessor and update documentation
parent
2c7f59ed
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
44 additions
and
41 deletions
+44
-41
doc/SW_archi.md
doc/SW_archi.md
+38
-32
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+3
-4
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+3
-5
No files found.
doc/SW_archi.md
View file @
53eb43ba
...
...
@@ -171,24 +171,31 @@ NR_sched_pusch_t (for values changing every TTI, e.g., frequency domain
allocation) and NR_sched_pusch_save_t (for values changing less frequently, at
least in FR1 [to my understanding], e.g., DMRS fields when the time domain
allocation stays between TTIs) structures. Furthermore, the preprocessor is an
exchangeable module that
might schedule differently, e.g., one user fo
r
phytest, multiple users in FR1, or maybe FR2: phytest is
in
nr_ul_preprocessor_phytest()
, for FR1 is nr_simple_ulsch_preprocessor() [under
development], for FR2 does not exist yet.
exchangeable module that
schedules differently based on a particula
r
use-case/deployment type, e.g., one user for phytest [
in
nr_ul_preprocessor_phytest()
], multiple users in FR1
[
nr_fr1_ulsch_preprocessor()], or maybe FR2 [does not exist yet
]:
*
calls preprocessor via pre_processor_ul(): the preprocessor is responsible
for allocating CCEs (using allocate_nr_CCEs())
. Note that we do not yet hav
e
scheduling requests or buffer status reports, and only one UE. E.g.,
nr_simple_ulsch_preprocessor()
:
for allocating CCEs (using allocate_nr_CCEs())
and deciding on resourc
e
allocation for the UEs including TB size. Note that we do not yet have
scheduling requests. What it typically does
:
1) check whether the current frame/slot plus K2 is an UL slot, and return if
not.
2) Find first free start RB in vrb_map_UL, and as many free consecutive RBs
as possible.
3) allocate a CCE for the UE (and return if it is not possible)
4) Calculate DMRS stuff (nr_save_pusch_fields()) and the TBS.
5) Mark used resources in vrb_map_UL.
*
loop through all users: get a free HARQ PID and
update statistics. Fill nFAPI structures directly for PUSCH, and call
config_uldci() and fill_dci_pdu_rel15() for DCI filling and PDCCH messages.
3) Either set up resource allocation directly (e.g., for a single UE,
phytest), or call into a function to perform actual resource allocation.
Currently, this is done using pf_ul() which implements a basic
proportional fair scheduler:
*
for every UE, check for retransmission and allocate as necessary
*
Calculate DMRS stuff (nr_save_pusch_fields())
*
Calculate the PF coefficient and put eligible UEs into a list
*
Allocate resources to the UE(s) with the highest coefficient
4) Mark used resources in vrb_map_UL.
*
loop through all users: get a HARQ process as indicated through the
preprocessor, update statistics, fill nFAPI structures directly for PUSCH,
and call config_uldci() and fill_dci_pdu_rel15() for DCI filling and PDCCH
messages.
Calls nr_schedule_ue_spec(). It is divided into the "preprocessor" and the
"postprocessor": the first makes the scheduling decisions, the second fills
...
...
@@ -196,29 +203,28 @@ nFAPI structures to indicate to the PHY what it is supposed to do. To signal
which users have how many resources, the preprocessor populates the
NR_UE_sched_ctrl_t structure of affected users. In particular, the field rbSize
decides whether a user is to be allocated. Furthermore, the preprocessor is an
exchangeable module that
might schedule differently, e.g., one user fo
r
phytest, multiple users in FR1, or maybe FR2: phytest is
in
nr_preprocessor_phytest()
, for FR1 is nr_simple_dlsch_preprocessor() [under
development], for FR2 does not exist yet
.
exchangeable module that
schedules differently based on a particula
r
use-case/deployment type, e.g., one user for phytest [
in
nr_preprocessor_phytest()
], multiple users in FR1
[nr_fr1_dlsch_preprocessor()], or maybe FR2 [does not exist yet]
.
*
calls preprocessor via pre_processor_dl(): the preprocessor is responsible
for allocating CCEs and PUCCH (using allocate_nr_CCEs() and
nr_acknack_scheduling()) and deciding on the frequency/time domain
allocation. E.g., nr_simple_dlsch_preprocessor():
1) mac_rlc_status_ind() locks and checks directly inside rlc data the
quantity of waiting data.
2) return from the preprocessor if there is no data and no timing advance to
send,
3) otherwise, allocate a CCE for the UE (and return if it is not possible)
4) find a PUCCH occasion for HARQ
5a) check if there is a retransmission: if yes, find free resources to
transmit using the same resources, else
5b) calculate the necessary RBs needed to get a TBS large enough to hold all
data, or until no more resources are available
6) Mark taken resources in the vrb_map
allocation including the TB size. What it typically does:
1) Check available resources in the vrb_map
2) Checks the quantity of waiting data in RLC
3) Either set up resource allocation directly (e.g., for a single UE,
phytest), or call into a function to perform actual resource allocation.
Currently, this is done using pf_dl() which implements a basic
proportional fair scheduler:
*
for every UE, check for retransmission and allocate as necessary
*
Calculate the PF coefficient and put eligible UEs into a list
*
Allocate resources to the UE(s) with the highest coefficient
4) Mark taken resources in the vrb_map
*
loop through all users: check if a new TA is necessary. Then, if a user has
allocated resources,
compute its TBS, and fill nFAPI structures
(nr_fill_nfapi_dl_pdu() to populate what should be done by the lower layers
to make the Tx subframe). Update statistics (round, sent bytes).
allocated resources,
update statistics (round, sent bytes), update HARQ
process information, and fill nFAPI structures (allocate a DCI and PDCCH
messages, TX_req, ...)
# RRC
RRC is a regular thread with itti loop on queue: TASK_RRC_GNB
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
View file @
53eb43ba
...
...
@@ -606,9 +606,8 @@ void pf_dl(module_id_t module_id,
}
}
void
nr_simple_dlsch_preprocessor
(
module_id_t
module_id
,
frame_t
frame
,
sub_frame_t
slot
)
{
void
nr_fr1_dlsch_preprocessor
(
module_id_t
module_id
,
frame_t
frame
,
sub_frame_t
slot
)
{
NR_UE_info_t
*
UE_info
=
&
RC
.
nrmac
[
module_id
]
->
UE_info
;
if
(
UE_info
->
num_UEs
==
0
)
...
...
@@ -647,7 +646,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
nr_pp_impl_dl
nr_init_fr1_dlsch_preprocessor
(
module_id_t
module_id
,
int
CC_id
)
{
return
nr_
simple
_dlsch_preprocessor
;
return
nr_
fr1
_dlsch_preprocessor
;
}
void
nr_schedule_ue_spec
(
module_id_t
module_id
,
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
53eb43ba
...
...
@@ -815,10 +815,8 @@ void pf_ul(module_id_t module_id,
}
}
bool
nr_simple_ulsch_preprocessor
(
module_id_t
module_id
,
frame_t
frame
,
sub_frame_t
slot
,
uint64_t
ulsch_in_slot_bitmap
)
{
bool
nr_fr1_ulsch_preprocessor
(
module_id_t
module_id
,
frame_t
frame
,
sub_frame_t
slot
,
uint64_t
ulsch_in_slot_bitmap
)
{
gNB_MAC_INST
*
nr_mac
=
RC
.
nrmac
[
module_id
];
NR_COMMON_channels_t
*
cc
=
nr_mac
->
common_channels
;
NR_ServingCellConfigCommon_t
*
scc
=
cc
->
ServingCellConfigCommon
;
...
...
@@ -896,7 +894,7 @@ bool nr_simple_ulsch_preprocessor(module_id_t module_id,
nr_pp_impl_ul
nr_init_fr1_ulsch_preprocessor
(
module_id_t
module_id
,
int
CC_id
)
{
return
nr_
simple
_ulsch_preprocessor
;
return
nr_
fr1
_ulsch_preprocessor
;
}
void
nr_schedule_ulsch
(
module_id_t
module_id
,
...
...
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