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
alex037yang
OpenXG-RAN
Commits
d28000c4
Commit
d28000c4
authored
Feb 14, 2021
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Restructure NR_UE_sched_ctrl_t: Group PDSCH variables in struct
parent
aa298eaa
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
157 additions
and
187 deletions
+157
-187
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+40
-27
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+70
-116
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+12
-11
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+35
-33
No files found.
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
View file @
d28000c4
...
...
@@ -254,9 +254,9 @@ void schedule_control_sib1(module_id_t module_id,
}
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
->
dmrs_DownlinkForPDSCH_MappingTypeA
->
choice
.
setup
->
dmrs_AdditionalPosition
=
NULL
;
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
=
time_domain_allocation
;
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
=
mcsTableIdx
;
gNB_mac
->
sched_ctrlCommon
->
mcs
=
mcs
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
time_domain_allocation
=
time_domain_allocation
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
=
mcsTableIdx
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
=
mcs
;
gNB_mac
->
sched_ctrlCommon
->
num_total_bytes
=
num_total_bytes
;
uint8_t
nr_of_candidates
;
...
...
@@ -277,18 +277,19 @@ void schedule_control_sib1(module_id_t module_id,
// Calculate number of symbols
struct
NR_PDSCH_TimeDomainResourceAllocationList
*
tdaList
=
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
]
->
startSymbolAndLength
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
time_domain_allocation
]
->
startSymbolAndLength
;
int
startSymbolIndex
,
nrOfSymbols
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
if
(
nrOfSymbols
==
2
)
{
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
=
1
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
numDmrsCdmGrpsNoData
=
1
;
}
else
{
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
=
2
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
numDmrsCdmGrpsNoData
=
2
;
}
// Calculate number of PRB_DMRS
uint8_t
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
6
;
uint8_t
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
numDmrsCdmGrpsNoData
*
6
;
uint16_t
dlDmrsSymbPos
=
fill_dmrs_mask
(
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
,
gNB_mac
->
common_channels
->
ServingCellConfigCommon
->
dmrs_TypeA_Position
,
startSymbolIndex
+
nrOfSymbols
);
uint16_t
dmrs_length
=
get_num_dmrs
(
dlDmrsSymbPos
);
...
...
@@ -296,22 +297,24 @@ void schedule_control_sib1(module_id_t module_id,
uint32_t
TBS
=
0
;
do
{
rbSize
++
;
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
),
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
),
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
),
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
),
rbSize
,
nrOfSymbols
,
N_PRB_DMRS
*
dmrs_length
,
0
,
0
,
1
)
>>
3
;
}
while
(
rbStart
+
rbSize
<
bwpSize
&&
!
vrb_map
[
rbStart
+
rbSize
]
&&
TBS
<
gNB_mac
->
sched_ctrlCommon
->
num_total_bytes
);
gNB_mac
->
sched_ctrlCommon
->
rbSize
=
rbSize
;
gNB_mac
->
sched_ctrlCommon
->
rbStart
=
0
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbSize
=
rbSize
;
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbStart
=
0
;
LOG_D
(
MAC
,
"SLIV = %i
\n
"
,
startSymbolAndLength
);
LOG_D
(
MAC
,
"startSymbolIndex = %i
\n
"
,
startSymbolIndex
);
LOG_D
(
MAC
,
"nrOfSymbols = %i
\n
"
,
nrOfSymbols
);
LOG_D
(
MAC
,
"rbSize = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
rbSize
);
LOG_D
(
MAC
,
"rbSize = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbSize
);
LOG_D
(
MAC
,
"TBS = %i
\n
"
,
TBS
);
// Mark the corresponding RBs as used
for
(
int
rb
=
0
;
rb
<
gNB_mac
->
sched_ctrlCommon
->
rbSize
;
rb
++
)
{
for
(
int
rb
=
0
;
rb
<
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbSize
;
rb
++
)
{
vrb_map
[
rb
+
rbStart
]
=
1
;
}
}
...
...
@@ -364,9 +367,9 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
}
pdsch_pdu_rel15
->
NrOfCodewords
=
1
;
pdsch_pdu_rel15
->
targetCodeRate
[
0
]
=
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
0
);
pdsch_pdu_rel15
->
targetCodeRate
[
0
]
=
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
0
);
pdsch_pdu_rel15
->
qamModOrder
[
0
]
=
2
;
pdsch_pdu_rel15
->
mcsIndex
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
mcs
;
pdsch_pdu_rel15
->
mcsIndex
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
;
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
0
;
pdsch_pdu_rel15
->
rvIndex
[
0
]
=
nr_rv_round_map
[
0
];
pdsch_pdu_rel15
->
dataScramblingId
=
*
scc
->
physCellId
;
...
...
@@ -376,15 +379,16 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
pdsch_pdu_rel15
->
dmrsConfigType
=
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
->
dmrs_DownlinkForPDSCH_MappingTypeA
->
choice
.
setup
->
dmrs_Type
==
NULL
?
0
:
1
;
pdsch_pdu_rel15
->
dlDmrsScramblingId
=
*
scc
->
physCellId
;
pdsch_pdu_rel15
->
SCID
=
0
;
pdsch_pdu_rel15
->
numDmrsCdmGrpsNoData
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
;
pdsch_pdu_rel15
->
numDmrsCdmGrpsNoData
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
numDmrsCdmGrpsNoData
;
pdsch_pdu_rel15
->
dmrsPorts
=
1
;
pdsch_pdu_rel15
->
resourceAlloc
=
1
;
pdsch_pdu_rel15
->
rbStart
=
gNB_mac
->
sched_ctrlCommon
->
rbStart
;
pdsch_pdu_rel15
->
rbSize
=
gNB_mac
->
sched_ctrlCommon
->
rbSize
;
pdsch_pdu_rel15
->
rbStart
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbStart
;
pdsch_pdu_rel15
->
rbSize
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbSize
;
pdsch_pdu_rel15
->
VRBtoPRBMapping
=
0
;
pdsch_pdu_rel15
->
qamModOrder
[
0
]
=
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
);
pdsch_pdu_rel15
->
qamModOrder
[
0
]
=
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
);
pdsch_pdu_rel15
->
TBSize
[
0
]
=
TBS
;
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
;
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
;
pdsch_pdu_rel15
->
StartSymbolIndex
=
StartSymbolIndex
;
pdsch_pdu_rel15
->
NrOfSymbols
=
NrOfSymbols
;
...
...
@@ -413,8 +417,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
dci_payload
.
frequency_domain_assignment
.
val
=
PRBalloc_to_locationandbandwidth0
(
pdsch_pdu_rel15
->
rbSize
,
pdsch_pdu_rel15
->
rbStart
,
gNB_mac
->
type0_PDCCH_CSS_config
.
num_rbs
);
dci_payload
.
time_domain_assignment
.
val
=
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
;
dci_payload
.
mcs
=
gNB_mac
->
sched_ctrlCommon
->
mcs
;
dci_payload
.
time_domain_assignment
.
val
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
time_domain_allocation
;
dci_payload
.
mcs
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
;
dci_payload
.
rv
=
pdsch_pdu_rel15
->
rvIndex
[
0
];
dci_payload
.
harq_pid
=
0
;
dci_payload
.
ndi
=
0
;
...
...
@@ -484,17 +488,26 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
// Calculate number of symbols
int
startSymbolIndex
,
nrOfSymbols
;
struct
NR_PDSCH_TimeDomainResourceAllocationList
*
tdaList
=
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
]
->
startSymbolAndLength
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
time_domain_allocation
]
->
startSymbolAndLength
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
// Calculate number of PRB_DMRS
uint8_t
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
6
;
uint8_t
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
numDmrsCdmGrpsNoData
*
6
;
uint16_t
dlDmrsSymbPos
=
fill_dmrs_mask
(
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
,
gNB_mac
->
common_channels
->
ServingCellConfigCommon
->
dmrs_TypeA_Position
,
startSymbolIndex
+
nrOfSymbols
);
uint16_t
dmrs_length
=
get_num_dmrs
(
dlDmrsSymbPos
);
const
uint32_t
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
),
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
),
gNB_mac
->
sched_ctrlCommon
->
rbSize
,
nrOfSymbols
,
N_PRB_DMRS
*
dmrs_length
,
0
,
0
,
1
)
>>
3
;
const
uint32_t
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
),
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcs
,
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
mcsTableIdx
),
gNB_mac
->
sched_ctrlCommon
->
sched_pdsch
.
rbSize
,
nrOfSymbols
,
N_PRB_DMRS
*
dmrs_length
,
0
,
0
,
1
)
>>
3
;
nfapi_nr_dl_tti_request_body_t
*
dl_req
=
&
gNB_mac
->
DL_req
[
CC_id
].
dl_tti_request_body
;
nr_fill_nfapi_dl_sib1_pdu
(
module_idP
,
dl_req
,
TBS
,
startSymbolIndex
,
nrOfSymbols
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
View file @
d28000c4
...
...
@@ -374,12 +374,10 @@ bool allocate_retransmission(module_id_t module_id,
int
current_harq_pid
)
{
NR_UE_info_t
*
UE_info
=
&
RC
.
nrmac
[
module_id
]
->
UE_info
;
NR_UE_sched_ctrl_t
*
sched_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
NR_
UE_ret_info_t
*
retInfo
=
&
sched_ctrl
->
retInfo
[
current_harq_pid
]
;
NR_
sched_pdsch_t
*
retInfo
=
&
sched_ctrl
->
harq_processes
[
current_harq_pid
].
sched_pdsch
;
const
uint16_t
bwpSize
=
NRRIV2BW
(
sched_ctrl
->
active_bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
MAX_BWP_SIZE
);
int
rbStart
=
NRRIV2PRBOFFSET
(
sched_ctrl
->
active_bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
MAX_BWP_SIZE
);
sched_ctrl
->
time_domain_allocation
=
retInfo
->
time_domain_allocation
;
/* Check the resource is enough for retransmission */
/* ensure that there is a free place for RB allocation */
int
rbSize
=
0
;
...
...
@@ -426,19 +424,14 @@ bool allocate_retransmission(module_id_t module_id,
return
false
;
}
/* Allocate retransmission */
sched_ctrl
->
rbSize
=
retInfo
->
rbSize
;
sched_ctrl
->
rbStart
=
rbStart
;
/* MCS etc: just reuse from previous scheduling opportunity */
sched_ctrl
->
mcsTableIdx
=
retInfo
->
mcsTableIdx
;
sched_ctrl
->
mcs
=
retInfo
->
mcs
;
sched_ctrl
->
numDmrsCdmGrpsNoData
=
retInfo
->
numDmrsCdmGrpsNoData
;
/* just reuse from previous scheduling opportunity, set new start RB */
sched_ctrl
->
sched_pdsch
=
*
retInfo
;
sched_ctrl
->
sched_pdsch
.
rbStart
=
rbStart
;
/* retransmissions: directly allocate */
*
n_rb_sched
-=
sched_ctrl
->
rbSize
;
for
(
int
rb
=
0
;
rb
<
sched_ctrl
->
rbSize
;
rb
++
)
rballoc_mask
[
rb
+
sched_ctrl
->
rbStart
]
=
0
;
*
n_rb_sched
-=
sched_ctrl
->
sched_pdsch
.
rbSize
;
for
(
int
rb
=
0
;
rb
<
sched_ctrl
->
sched_pdsch
.
rbSize
;
rb
++
)
rballoc_mask
[
rb
+
sched_ctrl
->
sched_pdsch
.
rbStart
]
=
0
;
return
true
;
}
...
...
@@ -461,10 +454,11 @@ void pf_dl(module_id_t module_id,
/* Loop UE_info->list to check retransmission */
for
(
int
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
NR_UE_sched_ctrl_t
*
sched_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
NR_sched_pdsch_t
*
sched_pdsch
=
&
sched_ctrl
->
sched_pdsch
;
sched_ctrl
->
search_space
=
get_searchspace
(
sched_ctrl
->
active_bwp
,
NR_SearchSpace__searchSpaceType_PR_ue_Specific
);
sched_ctrl
->
coreset
=
get_coreset
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
search_space
,
1
/* dedicated */
);
/* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
sched_
ctrl
->
dl_harq_pid
=
sched_ctrl
->
retrans_dl_harq
.
head
;
sched_
pdsch
->
dl_harq_pid
=
sched_ctrl
->
retrans_dl_harq
.
head
;
/* Calculate Throughput */
const
float
a
=
0
.
0005
f
;
// corresponds to 200ms window
...
...
@@ -472,15 +466,10 @@ void pf_dl(module_id_t module_id,
thr_ue
[
UE_id
]
=
(
1
-
a
)
*
thr_ue
[
UE_id
]
+
a
*
b
;
/* retransmission */
if
(
sched_
ctrl
->
dl_harq_pid
>=
0
)
{
if
(
sched_
pdsch
->
dl_harq_pid
>=
0
)
{
/* Allocate retransmission */
bool
r
=
allocate_retransmission
(
module_id
,
frame
,
slot
,
rballoc_mask
,
&
n_rb_sched
,
UE_id
,
sched_ctrl
->
dl_harq_pid
);
bool
r
=
allocate_retransmission
(
module_id
,
frame
,
slot
,
rballoc_mask
,
&
n_rb_sched
,
UE_id
,
sched_pdsch
->
dl_harq_pid
);
if
(
!
r
)
{
LOG_D
(
MAC
,
"%4d.%2d retransmission can NOT be allocated
\n
"
,
frame
,
slot
);
continue
;
...
...
@@ -494,21 +483,20 @@ void pf_dl(module_id_t module_id,
continue
;
/* Calculate coeff */
sched_ctrl
->
time_domain_allocation
=
2
;
sched_ctrl
->
mcsTableIdx
=
0
;
sched_ctrl
->
mcs
=
9
;
sched_ctrl
->
numDmrsCdmGrpsNoData
=
1
;
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
numDmrsCdmGrpsNoData
);
int
nrOfSymbols
=
getNrOfSymbols
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
time_domain_allocation
);
uint32_t
tbs
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
sched_pdsch
->
time_domain_allocation
=
2
;
sched_pdsch
->
mcsTableIdx
=
0
;
sched_pdsch
->
mcs
=
9
;
sched_pdsch
->
numDmrsCdmGrpsNoData
=
1
;
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
sched_pdsch
.
numDmrsCdmGrpsNoData
);
int
nrOfSymbols
=
getNrOfSymbols
(
sched_ctrl
->
active_bwp
,
sched_pdsch
->
time_domain_allocation
);
uint32_t
tbs
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
1
,
// rbSize
nrOfSymbols
,
N_PRB_DMRS
,
// FIXME // This should be multiplied by the
// number of dmrs symbols
0
/* N_PRB_oh, 0 for initialBWP */
,
0
/* tb_scaling */
,
0
/* N_PRB_oh, 0 for initialBWP */
,
0
/* tb_scaling */
,
1
/* nrOfLayers */
)
>>
3
;
coeff_ue
[
UE_id
]
=
(
float
)
tbs
/
thr_ue
[
UE_id
];
...
...
@@ -573,22 +561,13 @@ void pf_dl(module_id_t module_id,
return
;
}
/* Allocate transmission */
// Time-domain allocation
sched_ctrl
->
time_domain_allocation
=
2
;
// modulation scheme
sched_ctrl
->
mcsTableIdx
=
0
;
sched_ctrl
->
mcs
=
9
;
sched_ctrl
->
numDmrsCdmGrpsNoData
=
1
;
/* MCS, TDA, etc. has been set above */
// Freq-demain allocation
while
(
rbStart
<
bwpSize
&&
!
rballoc_mask
[
rbStart
])
rbStart
++
;
const
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
numDmrsCdmGrpsNoData
);
const
int
nrOfSymbols
=
getNrOfSymbols
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
time_domain_allocation
);
const
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
sched_pdsch
.
numDmrsCdmGrpsNoData
);
const
int
nrOfSymbols
=
getNrOfSymbols
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
sched_pdsch
.
time_domain_allocation
);
const
NR_ServingCellConfigCommon_t
*
scc
=
RC
.
nrmac
[
module_id
]
->
common_channels
->
ServingCellConfigCommon
;
const
uint8_t
N_DMRS_SLOT
=
get_num_dmrs_symbols
(
sched_ctrl
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
,
...
...
@@ -599,10 +578,11 @@ void pf_dl(module_id_t module_id,
uint32_t
TBS
=
0
;
const
int
oh
=
2
+
(
sched_ctrl
->
num_total_bytes
>=
256
)
+
2
*
(
frame
==
(
sched_ctrl
->
ta_frame
+
10
)
%
1024
);
NR_sched_pdsch_t
*
sched_pdsch
=
&
sched_ctrl
->
sched_pdsch
;
do
{
rbSize
++
;
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_
ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_
ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_
pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_
pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
rbSize
,
nrOfSymbols
,
N_PRB_DMRS
*
N_DMRS_SLOT
,
...
...
@@ -611,13 +591,13 @@ void pf_dl(module_id_t module_id,
1
/* nrOfLayers */
)
>>
3
;
}
while
(
rbStart
+
rbSize
<
bwpSize
&&
rballoc_mask
[
rbStart
+
rbSize
]
&&
TBS
<
sched_ctrl
->
num_total_bytes
+
oh
);
sched_
ctrl
->
rbSize
=
rbSize
;
sched_
ctrl
->
rbStart
=
rbStart
;
sched_
pdsch
->
rbSize
=
rbSize
;
sched_
pdsch
->
rbStart
=
rbStart
;
/* transmissions: directly allocate */
n_rb_sched
-=
sched_
ctrl
->
rbSize
;
for
(
int
rb
=
0
;
rb
<
sched_
ctrl
->
rbSize
;
rb
++
)
rballoc_mask
[
rb
+
sched_ctrl
->
rbStart
]
=
0
;
n_rb_sched
-=
sched_
pdsch
->
rbSize
;
for
(
int
rb
=
0
;
rb
<
sched_
pdsch
->
rbSize
;
rb
++
)
rballoc_mask
[
rb
+
sched_pdsch
->
rbStart
]
=
0
;
}
}
...
...
@@ -677,6 +657,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
NR_list_t
*
UE_list
=
&
UE_info
->
list
;
for
(
int
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
NR_UE_sched_ctrl_t
*
sched_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
NR_sched_pdsch_t
*
sched_pdsch
=
&
sched_ctrl
->
sched_pdsch
;
UE_info
->
mac_stats
[
UE_id
].
dlsch_current_bytes
=
0
;
/* update TA and set ta_apply every 10 frames.
...
...
@@ -688,7 +669,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
LOG_D
(
MAC
,
"[UE %d][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command
\n
"
,
UE_id
,
frame
,
slot
);
}
if
(
sched_
ctrl
->
rbSize
<=
0
)
if
(
sched_
pdsch
->
rbSize
<=
0
)
continue
;
const
rnti_t
rnti
=
UE_info
->
rnti
[
UE_id
];
...
...
@@ -696,29 +677,27 @@ void nr_schedule_ue_spec(module_id_t module_id,
/* POST processing */
struct
NR_PDSCH_TimeDomainResourceAllocationList
*
tdaList
=
sched_ctrl
->
active_bwp
->
bwp_Common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
;
AssertFatal
(
sched_
ctrl
->
time_domain_allocation
<
tdaList
->
list
.
count
,
AssertFatal
(
sched_
pdsch
->
time_domain_allocation
<
tdaList
->
list
.
count
,
"time_domain_allocation %d>=%d
\n
"
,
sched_
ctrl
->
time_domain_allocation
,
sched_
pdsch
->
time_domain_allocation
,
tdaList
->
list
.
count
);
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
sched_ctrl
->
time_domain_allocation
]
->
startSymbolAndLength
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
sched_pdsch
->
time_domain_allocation
]
->
startSymbolAndLength
;
int
startSymbolIndex
,
nrOfSymbols
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_ctrl
->
numDmrsCdmGrpsNoData
);
uint8_t
N_PRB_DMRS
=
getN_PRB_DMRS
(
sched_ctrl
->
active_bwp
,
sched_pdsch
->
numDmrsCdmGrpsNoData
);
uint8_t
N_DMRS_SLOT
=
get_num_dmrs_symbols
(
sched_ctrl
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
,
RC
.
nrmac
[
module_id
]
->
common_channels
->
ServingCellConfigCommon
->
dmrs_TypeA_Position
,
nrOfSymbols
);
const
nfapi_nr_dmrs_type_e
dmrsConfigType
=
getDmrsConfigType
(
sched_ctrl
->
active_bwp
);
const
int
nrOfLayers
=
1
;
const
uint16_t
R
=
nr_get_code_rate_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
);
const
uint
8_t
Qm
=
nr_get_Qm_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
);
const
uint
32_t
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_ctrl
->
mcs
,
sched_ctrl
->
mcsTableIdx
),
sched_ctrl
->
rbSize
,
/* TODO avoid recomputation! */
const
uint
16_t
R
=
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
);
const
uint
8_t
Qm
=
nr_get_Qm_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
);
const
uint32_t
TBS
=
nr_compute_tbs
(
nr_get_Qm_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
sched_pdsch
->
mcsTableIdx
),
sched_pdsch
->
rbSize
,
nrOfSymbols
,
N_PRB_DMRS
*
N_DMRS_SLOT
,
0
/* N_PRB_oh, 0 for initialBWP */
,
...
...
@@ -726,7 +705,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
nrOfLayers
)
>>
3
;
int8_t
current_harq_pid
=
sched_
ctrl
->
dl_harq_pid
;
int8_t
current_harq_pid
=
sched_
pdsch
->
dl_harq_pid
;
if
(
current_harq_pid
<
0
)
{
/* PP has not selected a specific HARQ Process, get a new one */
current_harq_pid
=
sched_ctrl
->
available_dl_harq
.
head
;
...
...
@@ -734,7 +713,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
"no free HARQ process available for UE %d
\n
"
,
UE_id
);
remove_front_nr_list
(
&
sched_ctrl
->
available_dl_harq
);
sched_
ctrl
->
dl_harq_pid
=
current_harq_pid
;
sched_
pdsch
->
dl_harq_pid
=
current_harq_pid
;
}
else
{
/* PP selected a specific HARQ process. Check whether it will be a new
* transmission or a retransmission, and remove from the corresponding
...
...
@@ -758,11 +737,11 @@ void nr_schedule_ue_spec(module_id_t module_id,
frame
,
slot
,
rnti
,
sched_
ctrl
->
rbStart
,
sched_
ctrl
->
rbSize
,
sched_
pdsch
->
rbStart
,
sched_
pdsch
->
rbSize
,
startSymbolIndex
,
nrOfSymbols
,
sched_
ctrl
->
mcs
,
sched_
pdsch
->
mcs
,
TBS
,
current_harq_pid
,
harq
->
round
,
...
...
@@ -818,8 +797,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdsch_pdu
->
NrOfCodewords
=
1
;
pdsch_pdu
->
targetCodeRate
[
0
]
=
R
;
pdsch_pdu
->
qamModOrder
[
0
]
=
Qm
;
pdsch_pdu
->
mcsIndex
[
0
]
=
sched_
ctrl
->
mcs
;
pdsch_pdu
->
mcsTable
[
0
]
=
sched_
ctrl
->
mcsTableIdx
;
pdsch_pdu
->
mcsIndex
[
0
]
=
sched_
pdsch
->
mcs
;
pdsch_pdu
->
mcsTable
[
0
]
=
sched_
pdsch
->
mcsTableIdx
;
pdsch_pdu
->
rvIndex
[
0
]
=
nr_rv_round_map
[
harq
->
round
];
pdsch_pdu
->
TBSize
[
0
]
=
TBS
;
...
...
@@ -836,13 +815,13 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdsch_pdu
->
dmrsConfigType
=
dmrsConfigType
;
pdsch_pdu
->
dlDmrsScramblingId
=
*
scc
->
physCellId
;
pdsch_pdu
->
SCID
=
0
;
pdsch_pdu
->
numDmrsCdmGrpsNoData
=
sched_
ctrl
->
numDmrsCdmGrpsNoData
;
pdsch_pdu
->
numDmrsCdmGrpsNoData
=
sched_
pdsch
->
numDmrsCdmGrpsNoData
;
pdsch_pdu
->
dmrsPorts
=
1
;
// Pdsch Allocation in frequency domain
pdsch_pdu
->
resourceAlloc
=
1
;
pdsch_pdu
->
rbStart
=
sched_
ctrl
->
rbStart
;
pdsch_pdu
->
rbSize
=
sched_
ctrl
->
rbSize
;
pdsch_pdu
->
rbStart
=
sched_
pdsch
->
rbStart
;
pdsch_pdu
->
rbSize
=
sched_
pdsch
->
rbSize
;
pdsch_pdu
->
VRBtoPRBMapping
=
1
;
// non-interleaved, check if this is ok for initialBWP
// Resource Allocation in time domain
...
...
@@ -901,8 +880,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdsch_pdu
->
rbSize
,
pdsch_pdu
->
rbStart
,
pdsch_pdu
->
BWPSize
);
dci_payload
.
time_domain_assignment
.
val
=
sched_
ctrl
->
time_domain_allocation
;
dci_payload
.
mcs
=
sched_
ctrl
->
mcs
;
dci_payload
.
time_domain_assignment
.
val
=
sched_
pdsch
->
time_domain_allocation
;
dci_payload
.
mcs
=
sched_
pdsch
->
mcs
;
dci_payload
.
rv
=
pdsch_pdu
->
rvIndex
[
0
];
dci_payload
.
harq_pid
=
current_harq_pid
;
dci_payload
.
ndi
=
harq
->
ndi
;
...
...
@@ -947,29 +926,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdcch_pdu
->
StartSymbolIndex
,
pdcch_pdu
->
DurationSymbols
);
NR_UE_ret_info_t
*
retInfo
=
&
sched_ctrl
->
retInfo
[
current_harq_pid
];
if
(
harq
->
round
!=
0
)
{
/* retransmission */
if
(
sched_ctrl
->
rbSize
!=
retInfo
->
rbSize
)
LOG_W
(
MAC
,
"retransmission uses different rbSize (%d vs. orig %d)
\n
"
,
sched_ctrl
->
rbSize
,
retInfo
->
rbSize
);
if
(
sched_ctrl
->
time_domain_allocation
!=
retInfo
->
time_domain_allocation
)
LOG_W
(
MAC
,
"retransmission uses different time_domain_allocation (%d vs. orig %d)
\n
"
,
sched_ctrl
->
time_domain_allocation
,
retInfo
->
time_domain_allocation
);
if
(
sched_ctrl
->
mcs
!=
retInfo
->
mcs
||
sched_ctrl
->
mcsTableIdx
!=
retInfo
->
mcsTableIdx
||
sched_ctrl
->
numDmrsCdmGrpsNoData
!=
retInfo
->
numDmrsCdmGrpsNoData
)
LOG_W
(
MAC
,
"retransmission uses different table/MCS/numDmrsCdmGrpsNoData (%d/%d/%d vs. orig %d/%d/%d)
\n
"
,
sched_ctrl
->
mcsTableIdx
,
sched_ctrl
->
mcs
,
sched_ctrl
->
numDmrsCdmGrpsNoData
,
retInfo
->
mcsTableIdx
,
retInfo
->
mcs
,
retInfo
->
numDmrsCdmGrpsNoData
);
/* we do not have to do anything, since we do not require to get data
* from RLC or encode MAC CEs. The TX_req structure is filled below
* or copy data to FAPI structures */
...
...
@@ -982,7 +939,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
current_harq_pid
,
harq
->
round
,
harq
->
ndi
);
AssertFatal
(
harq
->
tb_size
==
TBS
,
AssertFatal
(
harq
->
sched_pdsch
.
tb_size
==
TBS
,
"UE %d mismatch between scheduled TBS and buffered TB for HARQ PID %d
\n
"
,
UE_id
,
current_harq_pid
);
...
...
@@ -1098,11 +1055,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
UE_info
->
mac_stats
[
UE_id
].
dlsch_current_bytes
=
TBS
;
UE_info
->
mac_stats
[
UE_id
].
lc_bytes_tx
[
lcid
]
+=
dlsch_total_bytes
;
retInfo
->
rbSize
=
sched_ctrl
->
rbSize
;
retInfo
->
time_domain_allocation
=
sched_ctrl
->
time_domain_allocation
;
retInfo
->
mcsTableIdx
=
sched_ctrl
->
mcsTableIdx
;
retInfo
->
mcs
=
sched_ctrl
->
mcs
;
retInfo
->
numDmrsCdmGrpsNoData
=
sched_ctrl
->
numDmrsCdmGrpsNoData
;
/* save retransmission information */
harq
->
sched_pdsch
=
*
sched_pdsch
;
// ta command is sent, values are reset
if
(
sched_ctrl
->
ta_apply
)
{
...
...
@@ -1131,6 +1085,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
gNB_mac
->
TX_req
[
CC_id
].
Slot
=
slot
;
/* mark UE as scheduled */
sched_ctrl
->
rbSize
=
0
;
memset
(
sched_pdsch
,
0
,
sizeof
(
*
sched_pdsch
))
;
}
}
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
d28000c4
...
...
@@ -351,25 +351,26 @@ void nr_preprocessor_phytest(module_id_t module_id,
"could not find uplink slot for PUCCH (RNTI %04x@%d.%d)!
\n
"
,
rnti
,
frame
,
slot
);
sched_ctrl
->
rbStart
=
rbStart
;
sched_ctrl
->
rbSize
=
rbSize
;
sched_ctrl
->
time_domain_allocation
=
2
;
NR_sched_pdsch_t
*
sched_pdsch
=
&
sched_ctrl
->
sched_pdsch
;
sched_pdsch
->
rbStart
=
rbStart
;
sched_pdsch
->
rbSize
=
rbSize
;
sched_pdsch
->
time_domain_allocation
=
2
;
if
(
!
UE_info
->
secondaryCellGroup
[
UE_id
]
->
spCellConfig
->
spCellConfigDedicated
->
initialDownlinkBWP
->
pdsch_Config
->
choice
.
setup
->
mcs_Table
)
sched_
ctrl
->
mcsTableIdx
=
0
;
sched_
pdsch
->
mcsTableIdx
=
0
;
else
{
if
(
*
UE_info
->
secondaryCellGroup
[
UE_id
]
->
spCellConfig
->
spCellConfigDedicated
->
initialDownlinkBWP
->
pdsch_Config
->
choice
.
setup
->
mcs_Table
==
0
)
sched_
ctrl
->
mcsTableIdx
=
1
;
sched_
pdsch
->
mcsTableIdx
=
1
;
else
sched_
ctrl
->
mcsTableIdx
=
2
;
sched_
pdsch
->
mcsTableIdx
=
2
;
}
sched_
ctrl
->
mcs
=
9
;
sched_
ctrl
->
numDmrsCdmGrpsNoData
=
1
;
sched_
pdsch
->
mcs
=
9
;
sched_
pdsch
->
numDmrsCdmGrpsNoData
=
1
;
/* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
sched_
ctrl
->
dl_harq_pid
=
sched_ctrl
->
retrans_dl_harq
.
head
;
sched_
pdsch
->
dl_harq_pid
=
sched_ctrl
->
retrans_dl_harq
.
head
;
/* mark the corresponding RBs as used */
for
(
int
rb
=
0
;
rb
<
sched_
ctrl
->
rbSize
;
rb
++
)
vrb_map
[
rb
+
sched_
ctrl
->
rbStart
]
=
1
;
for
(
int
rb
=
0
;
rb
<
sched_
pdsch
->
rbSize
;
rb
++
)
vrb_map
[
rb
+
sched_
pdsch
->
rbStart
]
=
1
;
}
bool
nr_ul_preprocessor_phytest
(
module_id_t
module_id
,
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
d28000c4
...
...
@@ -352,6 +352,23 @@ typedef struct NR_sched_pusch {
int8_t
ul_harq_pid
;
}
NR_sched_pusch_t
;
typedef
struct
NR_sched_pdsch
{
/// RB allocation within active BWP
uint16_t
rbSize
;
uint16_t
rbStart
;
// time-domain allocation for scheduled RBs
int
time_domain_allocation
;
/// MCS-related infos
uint8_t
mcsTableIdx
;
uint8_t
mcs
;
uint8_t
numDmrsCdmGrpsNoData
;
/// DL HARQ PID to use for this UE, or -1 for "any new"
int8_t
dl_harq_pid
;
}
NR_sched_pdsch_t
;
typedef
struct
NR_UE_harq
{
bool
is_waiting
;
uint8_t
ndi
;
...
...
@@ -362,6 +379,9 @@ typedef struct NR_UE_harq {
/* Transport block to be sent using this HARQ process */
uint32_t
tb
[
16384
];
uint32_t
tb_size
;
//
/// sched_pdsch keeps information on MCS etc used for the initial transmission
NR_sched_pdsch_t
sched_pdsch
;
}
NR_UE_harq_t
;
//! fixme : need to enhace for the multiple TB CQI report
...
...
@@ -442,13 +462,6 @@ typedef struct nr_csi_report {
From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
*/
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
typedef
struct
NR_UE_old_sched
{
uint16_t
rbSize
;
int
time_domain_allocation
;
uint8_t
mcsTableIdx
;
uint8_t
mcs
;
uint8_t
numDmrsCdmGrpsNoData
;
}
NR_UE_ret_info_t
;
typedef
enum
{
INACTIVE
=
0
,
...
...
@@ -469,15 +482,18 @@ typedef struct NR_UE_ul_harq {
/*! \brief scheduling control information set through an API */
#define MAX_CSI_REPORTS 48
typedef
struct
{
/// total amount of data awaiting for this UE
uint32_t
num_total_bytes
;
/// per-LC status data
mac_rlc_status_resp_t
rlc_status
[
MAX_NUM_LCID
];
/// the currently active BWP in DL
NR_BWP_Downlink_t
*
active_bwp
;
/// the currently active BWP in UL
NR_BWP_Uplink_t
*
active_ubwp
;
/// CCE index and aggregation, should be coherent with cce_list
NR_SearchSpace_t
*
search_space
;
NR_ControlResourceSet_t
*
coreset
;
/// CCE index and Aggr. Level are shared for PUSCH/PDSCH allocation decisions
/// corresponding to the sched_pusch/sched_pdsch structures below
int
cce_index
;
uint8_t
aggregation_level
;
/// PUCCH scheduling information. Array of three, we assume for the moment:
/// HARQ in the first field, SR in second, CSI in third (as fixed by RRC
...
...
@@ -485,19 +501,11 @@ typedef struct {
/// nr_acknack_scheduling()!
NR_sched_pucch_t
sched_pucch
[
3
];
/// PUSCH save: PUSCH "configuration" that is not cleared across TTIs
NR_sched_pusch_save_t
pusch_save
;
/// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
NR_sched_pusch_t
sched_pusch
;
/// CCE index and aggregation, should be coherent with cce_list
NR_SearchSpace_t
*
search_space
;
NR_ControlResourceSet_t
*
coreset
;
int
cce_index
;
uint8_t
aggregation_level
;
/// RB allocation within active BWP
uint16_t
rbSize
;
uint16_t
rbStart
;
/// uplink bytes that are currently scheduled
int
sched_ul_bytes
;
/// estimation of the UL buffer size
...
...
@@ -508,18 +516,12 @@ typedef struct {
/// PHR info: nominal UE transmit power levels (dBm)
int
pcmax
;
// time-domain allocation for scheduled RBs
int
time_domain_allocation
;
/// MCS-related infos
uint8_t
mcsTableIdx
;
uint8_t
mcs
;
uint8_t
numDmrsCdmGrpsNoData
;
NR_sched_pdsch_t
sched_pdsch
;
///
Retransmission-related information
NR_UE_ret_info_t
retInfo
[
NR_MAX_NB_HARQ_PROCESSES
]
;
///
DL HARQ PID to use for this UE, or -1 for "any new"
int8_t
dl_harq_pid
;
///
total amount of data awaiting for this UE
uint32_t
num_total_bytes
;
///
per-LC status data
mac_rlc_status_resp_t
rlc_status
[
MAX_NUM_LCID
]
;
uint16_t
ta_frame
;
int16_t
ta_update
;
...
...
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