Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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 UE
Commits
b54d283e
Commit
b54d283e
authored
Oct 28, 2020
by
rmagueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update nr_extract_dci_info() for the NR_RNTI_SI case.
parent
86685897
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
351 additions
and
72 deletions
+351
-72
openair2/LAYER2/NR_MAC_UE/config_ue.c
openair2/LAYER2/NR_MAC_UE/config_ue.c
+31
-0
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+1
-0
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+33
-10
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+48
-19
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+0
-1
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+192
-26
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+46
-16
No files found.
openair2/LAYER2/NR_MAC_UE/config_ue.c
View file @
b54d283e
...
...
@@ -401,6 +401,37 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
mac
->
SSpace
[
0
][
0
][
ss_id
]
=
css
;
ss_id
++
;
}
// TODO: Merge this code in a single function as fill_default_searchSpaceZero() in rrc_gNB_reconfig.c
// Search space zero
if
(
mac
->
search_space_zero
==
NULL
)
mac
->
search_space_zero
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
));
if
(
mac
->
search_space_zero
->
controlResourceSetId
==
NULL
)
mac
->
search_space_zero
->
controlResourceSetId
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
controlResourceSetId
));
if
(
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
==
NULL
)
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
));
if
(
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
buf
==
NULL
)
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
buf
=
calloc
(
1
,
2
);
if
(
mac
->
search_space_zero
->
nrofCandidates
==
NULL
)
mac
->
search_space_zero
->
nrofCandidates
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
nrofCandidates
));
if
(
mac
->
search_space_zero
->
searchSpaceType
==
NULL
)
mac
->
search_space_zero
->
searchSpaceType
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
searchSpaceType
));
if
(
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
==
NULL
)
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
));
if
(
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
->
dci_Format0_0_AndFormat1_0
==
NULL
)
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
->
dci_Format0_0_AndFormat1_0
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
searchSpaceType
->
choice
.
common
->
dci_Format0_0_AndFormat1_0
));
mac
->
search_space_zero
->
searchSpaceId
=
0
;
*
mac
->
search_space_zero
->
controlResourceSetId
=
0
;
mac
->
search_space_zero
->
monitoringSlotPeriodicityAndOffset
=
calloc
(
1
,
sizeof
(
*
mac
->
search_space_zero
->
monitoringSlotPeriodicityAndOffset
));
mac
->
search_space_zero
->
monitoringSlotPeriodicityAndOffset
->
present
=
NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1
;
mac
->
search_space_zero
->
duration
=
NULL
;
// should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
buf
[
1
]
=
0
;
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
buf
[
0
]
=
(
1
<<
7
)
|
(
1
<<
6
);
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
size
=
2
;
mac
->
search_space_zero
->
monitoringSymbolsWithinSlot
->
bits_unused
=
2
;
mac
->
search_space_zero
->
nrofCandidates
->
aggregationLevel1
=
NR_SearchSpace__nrofCandidates__aggregationLevel1_n0
;
mac
->
search_space_zero
->
nrofCandidates
->
aggregationLevel2
=
NR_SearchSpace__nrofCandidates__aggregationLevel2_n0
;
mac
->
search_space_zero
->
nrofCandidates
->
aggregationLevel4
=
NR_SearchSpace__nrofCandidates__aggregationLevel4_n1
;
mac
->
search_space_zero
->
nrofCandidates
->
aggregationLevel8
=
NR_SearchSpace__nrofCandidates__aggregationLevel8_n0
;
mac
->
search_space_zero
->
nrofCandidates
->
aggregationLevel16
=
NR_SearchSpace__nrofCandidates__aggregationLevel16_n0
;
mac
->
search_space_zero
->
searchSpaceType
->
present
=
NR_SearchSpace__searchSpaceType_PR_common
;
}
int
nr_rrc_mac_config_req_ue
(
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
b54d283e
...
...
@@ -255,6 +255,7 @@ typedef struct {
uint8_t
PHR_reporting_active
;
NR_Type0_PDCCH_CSS_config_t
type0_PDCCH_CSS_config
;
NR_SearchSpace_t
*
search_space_zero
;
}
NR_UE_MAC_INST_t
;
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
View file @
b54d283e
...
...
@@ -74,7 +74,13 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
NR_ServingCellConfigCommon_t
*
scc
=
mac
->
scc
;
NR_BWP_DownlinkCommon_t
*
bwp_Common
=
mac
->
DLbwp
[
bwp_id
-
1
]
->
bwp_Common
;
NR_BWP_DownlinkCommon_t
*
initialDownlinkBWP
=
scc
->
downlinkConfigCommon
->
initialDownlinkBWP
;
NR_SearchSpace_t
*
ss
=
mac
->
SSpace
[
bwp_id
-
1
][
coreset_id
-
1
][
ss_id
];
NR_SearchSpace_t
*
ss
;
if
(
ss_id
>=
0
)
{
ss
=
mac
->
SSpace
[
bwp_id
-
1
][
coreset_id
-
1
][
ss_id
];
}
else
{
ss
=
mac
->
search_space_zero
;
}
// CORESET configuration
NR_ControlResourceSet_t
*
coreset
=
mac
->
coreset
[
bwp_id
-
1
][
coreset_id
-
1
];
...
...
@@ -154,7 +160,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15
->
SubcarrierSpacing
=
bwp_Common
->
genericParameters
.
subcarrierSpacing
;
for
(
int
i
=
0
;
i
<
rel15
->
num_dci_options
;
i
++
)
{
rel15
->
dci_length_options
[
i
]
=
nr_dci_size
(
scc
,
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format_options
[
i
],
NR_RNTI_
C
,
rel15
->
BWPSize
,
bwp_id
);
rel15
->
dci_length_options
[
i
]
=
nr_dci_size
(
scc
,
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format_options
[
i
],
NR_RNTI_
SI
,
rel15
->
BWPSize
,
bwp_id
);
}
printf
(
"bwp_Common->genericParameters.locationAndBandwidth = %li
\n
"
,
bwp_Common
->
genericParameters
.
locationAndBandwidth
);
...
...
@@ -220,14 +226,10 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
// Fetch configuration for searchSpaceZero
// note: The search space with the SearchSpaceId = 0 identifies the search space configured via PBCH (MIB) and in ServingCellConfigCommon (searchSpaceZero).
if
(
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceZero
){
printf
(
"pdcch_ConfigCommon->choice.setup->searchSpaceZero = %li
\n
"
,
*
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceZero
);
if
(
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
==
NULL
){
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
=
calloc
(
1
,
sizeof
(
*
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
));
}
*
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
=
0
;
LOG_D
(
MAC
,
"[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP
\n
"
);
LOG_W
(
MAC
,
"[DCI_CONFIG] This should not be available yet..."
);
}
...
...
@@ -251,14 +253,14 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
}
}
}
if
(
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
){
/*
if (pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
printf("*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = %li\n", *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1);
printf("ss->searchSpaceId = %li\n", ss->searchSpaceId);
// FIXME:
//if (ss->searchSpaceId == *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
if (ss->searchSpaceId == *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
if( (frame%2 == mac->type0_PDCCH_CSS_config.sfn_c) && (slot == mac->type0_PDCCH_CSS_config.n_0) ){
rel15->num_dci_options = 1;
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
...
...
@@ -266,8 +268,8 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
fill_dci_search_candidates(ss, rel15);
}
//
}
}
}
}
*/
if
(
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceOtherSystemInformation
){
if
(
ss
->
searchSpaceId
==
*
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceOtherSystemInformation
){
// Configure monitoring of PDCCH candidates in Type0-PDCCH common search space on the MCG
...
...
@@ -360,4 +362,25 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
break
;
}
}
// Search space 0, CORESET ID 0
NR_BWP_DownlinkCommon_t
*
bwp_Common
=
bwp
->
bwp_Common
;
NR_SetupRelease_PDCCH_ConfigCommon_t
*
pdcch_ConfigCommon
=
bwp_Common
->
pdcch_ConfigCommon
;
if
(
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
){
NR_SearchSpace_t
*
ss0
=
mac
->
search_space_zero
;
fapi_nr_dl_config_dci_dl_pdu_rel15_t
*
rel15
=
&
dl_config
->
dl_config_list
[
dl_config
->
number_pdus
].
dci_config_pdu
.
dci_config_rel15
;
if
(
ss0
->
searchSpaceId
==
*
pdcch_ConfigCommon
->
choice
.
setup
->
searchSpaceSIB1
){
if
(
(
frame
%
2
==
mac
->
type0_PDCCH_CSS_config
.
sfn_c
)
&&
(
slot
==
mac
->
type0_PDCCH_CSS_config
.
n_0
)
){
rel15
->
num_dci_options
=
1
;
rel15
->
dci_format_options
[
0
]
=
NR_DL_DCI_FORMAT_1_0
;
config_dci_pdu
(
mac
,
rel15
,
dl_config
,
NR_RNTI_SI
,
-
1
);
fill_dci_search_candidates
(
ss0
,
rel15
);
}
}
}
}
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
b54d283e
...
...
@@ -2943,7 +2943,7 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
case
NR_RNTI_RA
:
case
NR_RNTI_TC
:
case
NR_RNTI_P
:
case
NR_RNTI_SI
:
//
case NR_RNTI_SI:
if
(
mac
->
DLbwp
[
0
]
->
bwp_Common
->
pdcch_ConfigCommon
->
choice
.
setup
->
controlResourceSetZero
)
{
uint8_t
bwp_id
=
1
;
uint8_t
coreset_id
=
0
;
// assuming controlResourceSetId is 0 for controlResourceSetZero
...
...
@@ -2953,8 +2953,9 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
N_RB
=
NRRIV2BW
(
mac
->
scc
->
downlinkConfigCommon
->
initialDownlinkBWP
->
genericParameters
.
locationAndBandwidth
,
275
);
}
break
;
case
NR_RNTI_SI
:
case
NR_RNTI_C
:
N_RB
=
NRRIV2BW
(
mac
->
DLbwp
[
0
]
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
N_RB
=
NRRIV2BW
(
mac
->
DLbwp
[
0
]
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
break
;
}
return
N_RB
;
...
...
@@ -3192,23 +3193,51 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
break
;
case
NR_RNTI_SI
:
/*
// Freq domain assignment 0-16 bit
fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) );
for (int i=0; i<fsize; i++)
*dci_pdu |= ((dci_pdu_rel15->frequency_domain_assignment>>(fsize-i-1))&1)<<(dci_size-pos++);
// Time domain assignment 4 bit
for (int i=0; i<4; i++)
*dci_pdu |= (((uint64_t)dci_pdu_rel15->time_domain_assignment>>(3-i))&1)<<(dci_size-pos++);
// VRB to PRB mapping 1 bit
*dci_pdu |= ((uint64_t)dci_pdu_rel15->vrb_to_prb_mapping.val&1)<<(dci_size-pos++);
// MCS 5bit //bit over 32, so dci_pdu ++
for (int i=0; i<5; i++)
*dci_pdu |= (((uint64_t)dci_pdu_rel15->mcs>>(4-i))&1)<<(dci_size-pos++);
// Redundancy version 2bit
for (int i=0; i<2; i++)
*dci_pdu |= (((uint64_t)dci_pdu_rel15->rv>>(1-i))&1)<<(dci_size-pos++);
*/
printf
(
"
\n
nr_extract_dci_info
\n\n
"
);
// Freq domain assignment 0-16 bit
fsize
=
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
);
pos
+=
fsize
;
dci_pdu_rel15
->
frequency_domain_assignment
.
val
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
((
1
<<
fsize
)
-
1
);
// Time domain assignment 4 bit
pos
+=
4
;
dci_pdu_rel15
->
time_domain_assignment
.
val
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0xf
;
// VRB to PRB mapping 1 bit
pos
++
;
dci_pdu_rel15
->
vrb_to_prb_mapping
.
val
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0x1
;
// MCS 5bit //bit over 32, so dci_pdu ++
pos
+=
5
;
dci_pdu_rel15
->
mcs
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0x1f
;
// Redundancy version 2 bit
pos
+=
2
;
dci_pdu_rel15
->
rv
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
3
;
// System information indicator 1 bit
pos
++
;
dci_pdu_rel15
->
system_info_indicator
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0x1
;
printf
(
"
\n\n
"
);
for
(
int
i
=
64
-
dci_size
;
i
<
64
;
i
++
)
{
printf
(
"%i "
,
(
*
dci_pdu
>>
63
-
i
)
&
(
uint64_t
)
0x01
);
}
printf
(
"
\n
N_RB = %i
\n
"
,
N_RB
);
printf
(
"
\n
dci_size = %i
\n
"
,
dci_size
);
printf
(
"fsize = %i
\n
"
,
fsize
);
printf
(
"dci_pdu_rel15->frequency_domain_assignment.val = %i
\n
"
,
dci_pdu_rel15
->
frequency_domain_assignment
.
val
);
printf
(
"dci_pdu_rel15->time_domain_assignment.val = %i
\n
"
,
dci_pdu_rel15
->
time_domain_assignment
.
val
);
printf
(
"dci_pdu_rel15->vrb_to_prb_mapping.val = %i
\n
"
,
dci_pdu_rel15
->
vrb_to_prb_mapping
.
val
);
printf
(
"dci_pdu_rel15->mcs = %i
\n
"
,
dci_pdu_rel15
->
mcs
);
printf
(
"dci_pdu_rel15->rv = %i
\n
"
,
dci_pdu_rel15
->
rv
);
printf
(
"dci_pdu_rel15->system_info_indicator = %i
\n
"
,
dci_pdu_rel15
->
system_info_indicator
);
printf
(
"
\n
"
);
break
;
case
NR_RNTI_TC
:
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
View file @
b54d283e
...
...
@@ -460,7 +460,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// This schedules SIB1
schedule_nr_sib1
(
module_idP
,
frame
,
slot
);
// This schedule PRACH if we are not in phy_test mode
if
(
get_softmodem_params
()
->
phy_test
==
0
)
{
schedule_nr_prach
(
module_idP
,
frame
,
slot
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
View file @
b54d283e
...
...
@@ -175,7 +175,19 @@ void schedule_control_sib1(module_id_t module_id,
fill_default_coresetZero
(
gNB_mac
->
sched_ctrlCommon
->
coreset
);
}
gNB_mac
->
sched_ctrlCommon
->
active_bwp
=
gNB_mac
->
secondaryCellGroupCommon
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
array
[
bwp_id
-
1
];
//NR_COMMON_channels_t *cc = &gNB_mac->common_channels[0];
//NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
//scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth;
gNB_mac
->
sched_ctrlCommon
->
rbSize
=
0
;
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
=
time_domain_allocation
;
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
=
mcsTableIdx
;
...
...
@@ -192,26 +204,9 @@ void schedule_control_sib1(module_id_t module_id,
0
,
0
);
// Calculate number of PRB_DMRS
uint8_t
N_PRB_DMRS
;
if
(
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
->
dmrs_DownlinkForPDSCH_MappingTypeA
->
choice
.
setup
->
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
6
;
}
else
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
4
;
}
// 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
;
int
startSymbolIndex
,
nrOfSymbols
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
// Calculate rbStart and rbSize
gNB_mac
->
sched_ctrlCommon
->
rbStart
=
NRRIV2PRBOFFSET
(
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
gNB_mac
->
sched_ctrlCommon
->
rbSize
=
gNB_mac
->
type0_PDCCH_CSS_config
.
num_rbs
;
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
,
0
,
0
,
1
)
>>
3
;
gNB_mac
->
sched_ctrlCommon
->
rbSize
=
4
;
//24; //gNB_mac->type0_PDCCH_CSS_config.num_rbs;
// Mark the corresponding RBs as used
uint8_t
*
vrb_map
=
RC
.
nrmac
[
module_id
]
->
common_channels
[
CC_id
].
vrb_map
;
...
...
@@ -224,12 +219,8 @@ void schedule_control_sib1(module_id_t module_id,
printf
(
"cce_index = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
cce_index
);
printf
(
"aggregation_level = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
aggregation_level
);
printf
(
"nr_of_candidates = %i
\n
"
,
nr_of_candidates
);
printf
(
"startSymbolIndex = %i
\n
"
,
startSymbolIndex
);
printf
(
"nrOfSymbols = %i
\n
"
,
nrOfSymbols
);
printf
(
"rbSize = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
rbSize
);
printf
(
"rbStart = %i
\n
"
,
gNB_mac
->
sched_ctrlCommon
->
rbStart
);
printf
(
"TBS = %i
\n
"
,
TBS
);
printf
(
"N_PRB_DMRS = %i
\n
"
,
N_PRB_DMRS
);
}
void
nr_fill_nfapi_dci_sib1_pdu
(
int
Mod_idP
,
nfapi_nr_dl_tti_request_body_t
*
dl_req
)
{
...
...
@@ -239,6 +230,9 @@ void nr_fill_nfapi_dci_sib1_pdu(int Mod_idP, nfapi_nr_dl_tti_request_body_t *dl_
NR_BWP_Downlink_t
*
bwp
=
gNB_mac
->
sched_ctrlCommon
->
active_bwp
;
long
locationAndBandwidth
=
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
;
//long locationAndBandwidth = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth;
int
dci10_bw
=
NRRIV2BW
(
locationAndBandwidth
,
275
);
nfapi_nr_dl_tti_request_pdu_t
*
dl_tti_pdcch_pdu
=
&
dl_req
->
dl_tti_pdu_list
[
dl_req
->
nPDUs
];
...
...
@@ -267,6 +261,7 @@ void nr_fill_nfapi_dci_sib1_pdu(int Mod_idP, nfapi_nr_dl_tti_request_body_t *dl_
dci_pdu_rel15
[
0
].
pdsch_to_harq_feedback_timing_indicator
.
val
=
0
;
dci_pdu_rel15
[
0
].
antenna_ports
.
val
=
0
;
dci_pdu_rel15
[
0
].
dmrs_sequence_initialization
.
val
=
0
;
dci_pdu_rel15
[
0
].
system_info_indicator
=
0
;
nr_configure_pdcch
(
gNB_mac
,
pdcch_pdu_rel15
,
...
...
@@ -284,13 +279,90 @@ void nr_fill_nfapi_dci_sib1_pdu(int Mod_idP, nfapi_nr_dl_tti_request_body_t *dl_
rnti_types
[
0
]
=
NR_RNTI_SI
;
fill_dci_pdu_rel15
(
scc
,
gNB_mac
->
secondaryCellGroupCommon
,
pdcch_pdu_rel15
,
dci_pdu_rel15
,
dci_formats
,
rnti_types
,
dci10_bw
,
bwp
->
bwp_Id
);
//fill_dci_pdu_rel15(scc,gNB_mac->secondaryCellGroupCommon,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types, 50,bwp->bwp_Id);
dl_req
->
nPDUs
+=
1
;
//dl_req->nPDUs += 1; // -----------------------------
printf
(
"locationAndBandwidth = %li
\n
"
,
locationAndBandwidth
);
printf
(
"dci10_bw = %i
\n
"
,
dci10_bw
);
}
void
nr_fill_nfapi_sib1_pdu
(
int
Mod_idP
,
nfapi_nr_dl_tti_request_body_t
*
dl_req
)
{
gNB_MAC_INST
*
gNB_mac
=
RC
.
nrmac
[
Mod_idP
];
NR_BWP_Downlink_t
*
bwp
=
gNB_mac
->
sched_ctrlCommon
->
active_bwp
;
nfapi_nr_dl_tti_request_pdu_t
*
dl_tti_pdsch_pdu
=
&
dl_req
->
dl_tti_pdu_list
[
dl_req
->
nPDUs
+
1
];
memset
((
void
*
)
dl_tti_pdsch_pdu
,
0
,
sizeof
(
nfapi_nr_dl_tti_request_pdu_t
));
dl_tti_pdsch_pdu
->
PDUType
=
NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE
;
dl_tti_pdsch_pdu
->
PDUSize
=
(
uint8_t
)(
2
+
sizeof
(
nfapi_nr_dl_tti_pdsch_pdu
));
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
pdsch_pdu_rel15
=
&
dl_tti_pdsch_pdu
->
pdsch_pdu
.
pdsch_pdu_rel15
;
// Calculate number of symbols
struct
NR_PDSCH_TimeDomainResourceAllocationList
*
tdaList
=
bwp
->
bwp_Common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
;
const
int
startSymbolAndLength
=
tdaList
->
list
.
array
[
gNB_mac
->
sched_ctrlCommon
->
time_domain_allocation
]
->
startSymbolAndLength
;
int
startSymbolIndex
,
nrOfSymbols
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
// Calculate number of PRB_DMRS
uint8_t
N_PRB_DMRS
;
if
(
bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
->
dmrs_DownlinkForPDSCH_MappingTypeA
->
choice
.
setup
->
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
6
;
}
else
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
4
;
}
pdsch_pdu_rel15
->
pduBitmap
=
0
;
pdsch_pdu_rel15
->
rnti
=
0xFFFF
;
pdsch_pdu_rel15
->
pduIndex
=
gNB_mac
->
pdu_index
[
0
]
++
;
pdsch_pdu_rel15
->
BWPSize
=
NRRIV2BW
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
pdsch_pdu_rel15
->
BWPStart
=
NRRIV2PRBOFFSET
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
pdsch_pdu_rel15
->
SubcarrierSpacing
=
bwp
->
bwp_Common
->
genericParameters
.
subcarrierSpacing
;
if
(
bwp
->
bwp_Common
->
genericParameters
.
cyclicPrefix
)
{
pdsch_pdu_rel15
->
CyclicPrefix
=
*
bwp
->
bwp_Common
->
genericParameters
.
cyclicPrefix
;
}
else
{
pdsch_pdu_rel15
->
CyclicPrefix
=
0
;
}
pdsch_pdu_rel15
->
NrOfCodewords
=
1
;
pdsch_pdu_rel15
->
targetCodeRate
[
0
]
=
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
0
);
pdsch_pdu_rel15
->
qamModOrder
[
0
]
=
nr_get_Qm_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
);
pdsch_pdu_rel15
->
mcsIndex
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
mcs
;
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
0
;
pdsch_pdu_rel15
->
rvIndex
[
0
]
=
0
;
pdsch_pdu_rel15
->
dataScramblingId
=
*
gNB_mac
->
common_channels
->
ServingCellConfigCommon
->
physCellId
;
pdsch_pdu_rel15
->
nrOfLayers
=
1
;
pdsch_pdu_rel15
->
transmissionScheme
=
0
;
pdsch_pdu_rel15
->
refPoint
=
0
;
// Point A
pdsch_pdu_rel15
->
dmrsConfigType
=
0
;
pdsch_pdu_rel15
->
dlDmrsScramblingId
=
*
gNB_mac
->
common_channels
->
ServingCellConfigCommon
->
physCellId
;
pdsch_pdu_rel15
->
SCID
=
0
;
pdsch_pdu_rel15
->
numDmrsCdmGrpsNoData
=
gNB_mac
->
sched_ctrlCommon
->
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
->
VRBtoPRBMapping
=
1
;
// non-interleaved, check if this is ok for initialBWP
pdsch_pdu_rel15
->
targetCodeRate
[
0
]
=
nr_get_code_rate_dl
(
gNB_mac
->
sched_ctrlCommon
->
mcs
,
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
);
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
gNB_mac
->
sched_ctrlCommon
->
mcsTableIdx
;
pdsch_pdu_rel15
->
StartSymbolIndex
=
startSymbolIndex
;
pdsch_pdu_rel15
->
NrOfSymbols
=
nrOfSymbols
;
pdsch_pdu_rel15
->
TBSize
[
0
]
=
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
,
0
,
0
,
1
)
>>
3
;
pdsch_pdu_rel15
->
dlDmrsSymbPos
=
fill_dmrs_mask
(
bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
,
gNB_mac
->
common_channels
->
ServingCellConfigCommon
->
dmrs_TypeA_Position
,
pdsch_pdu_rel15
->
NrOfSymbols
);
dl_req
->
nPDUs
+=
2
;
// ----------------------------
}
void
schedule_nr_sib1
(
module_id_t
module_idP
,
frame_t
frameP
,
sub_frame_t
slotP
)
{
printf
(
"
\n\n
--- Schedule_nr_sib1: Start
\n
"
);
...
...
@@ -300,7 +372,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
int
bwp_id
=
1
;
int
time_domain_allocation
=
0
;
uint8_t
mcsTableIdx
=
0
;
uint8_t
mcs
=
9
;
uint8_t
mcs
=
3
;
// 9
uint8_t
numDmrsCdmGrpsNoData
=
1
;
gNB_MAC_INST
*
gNB_mac
=
RC
.
nrmac
[
module_idP
];
...
...
@@ -323,7 +395,6 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
printf
(
"sfn_c = %i
\n
"
,
gNB_mac
->
type0_PDCCH_CSS_config
.
sfn_c
);
printf
(
"n_0 = %i
\n
"
,
gNB_mac
->
type0_PDCCH_CSS_config
.
n_0
);
if
(
(
frameP
%
2
==
gNB_mac
->
type0_PDCCH_CSS_config
.
sfn_c
)
&&
(
slotP
==
gNB_mac
->
type0_PDCCH_CSS_config
.
n_0
)
)
{
printf
(
"
\n
SIB1 will be transmitted here
\n
"
);
...
...
@@ -345,8 +416,103 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
}
printf
(
"
\n
"
);
// TODO: Schedule broadcast the SIB1
// Schedule broadcast the SIB1
nr_fill_nfapi_sib1_pdu
(
module_idP
,
dl_req
);
const
int
ta_len
=
2
;
// 0 or 2
// Get RLC data TODO: remove random data retrieval
int
header_length_total
=
0
;
int
header_length_last
=
0
;
int
sdu_length_total
=
0
;
int
num_sdus
=
0
;
uint16_t
sdu_lengths
[
NB_RB_MAX
]
=
{
0
};
uint8_t
mac_sdus
[
MAX_NR_DLSCH_PAYLOAD_BYTES
];
unsigned
char
sdu_lcids
[
NB_RB_MAX
]
=
{
0
};
const
int
lcid
=
DL_SCH_LCID_DTCH
;
// Calculate number of PRB_DMRS
uint8_t
N_PRB_DMRS
;
if
(
gNB_mac
->
sched_ctrlCommon
->
active_bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
->
dmrs_DownlinkForPDSCH_MappingTypeA
->
choice
.
setup
->
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
6
;
}
else
{
N_PRB_DMRS
=
gNB_mac
->
sched_ctrlCommon
->
numDmrsCdmGrpsNoData
*
4
;
}
// 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
;
int
startSymbolIndex
,
nrOfSymbols
;
SLIV2SL
(
startSymbolAndLength
,
&
startSymbolIndex
,
&
nrOfSymbols
);
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
,
0
,
0
,
1
)
>>
3
;
printf
(
"TBS = %i
\n
"
,
TBS
);
LOG_D
(
MAC
,
"Configuring DL_TX in %d.%d: random data
\n
"
,
frameP
,
slotP
);
// fill dlsch_buffer with random data
for
(
int
i
=
0
;
i
<
TBS
;
i
++
)
mac_sdus
[
i
]
=
(
unsigned
char
)
(
lrand48
()
&
0xff
);
sdu_lcids
[
0
]
=
0x3f
;
// DRB
sdu_lengths
[
0
]
=
TBS
-
ta_len
-
3
;
header_length_total
+=
2
+
(
sdu_lengths
[
0
]
>=
128
);
sdu_length_total
+=
sdu_lengths
[
0
];
num_sdus
+=
1
;
// Check if there is data from RLC or CE
const
int
post_padding
=
TBS
>=
2
+
header_length_total
+
sdu_length_total
+
ta_len
;
// padding param currently not in use
//padding = TBS - header_length_total - sdu_length_total - ta_len - 1;
const
int
ntx_req
=
gNB_mac
->
TX_req
[
CC_id
].
Number_of_PDUs
;
nfapi_nr_pdu_t
*
tx_req
=
&
gNB_mac
->
TX_req
[
CC_id
].
pdu_list
[
ntx_req
];
// pointer to directly generate the PDU into the nFAPI structure
uint32_t
*
buf
=
tx_req
->
TLVs
[
0
].
value
.
direct
;
const
int
offset
=
nr_generate_dlsch_pdu
(
module_idP
,
gNB_mac
->
sched_ctrlCommon
,
(
unsigned
char
*
)
mac_sdus
,
(
unsigned
char
*
)
buf
,
num_sdus
,
// num_sdus
sdu_lengths
,
sdu_lcids
,
255
,
// no drx
NULL
,
// contention res id
post_padding
);
// Padding: fill remainder of DLSCH with 0
if
(
post_padding
>
0
)
{
for
(
int
j
=
0
;
j
<
TBS
-
offset
;
j
++
)
buf
[
offset
+
j
]
=
0
;
}
tx_req
->
PDU_length
=
TBS
;
tx_req
->
PDU_index
=
gNB_mac
->
pdu_index
[
0
]
++
;
tx_req
->
num_TLV
=
1
;
tx_req
->
TLVs
[
0
].
length
=
TBS
+
2
;
gNB_mac
->
TX_req
[
CC_id
].
Number_of_PDUs
++
;
gNB_mac
->
TX_req
[
CC_id
].
SFN
=
frameP
;
gNB_mac
->
TX_req
[
CC_id
].
Slot
=
slotP
;
}
printf
(
"--- Schedule_nr_sib1: End
\n\n\n
"
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
View file @
b54d283e
...
...
@@ -1167,22 +1167,52 @@ void fill_dci_pdu_rel15(NR_ServingCellConfigCommon_t *scc,
break
;
case
NR_RNTI_SI
:
// Freq domain assignment 0-16 bit
fsize
=
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
);
for
(
int
i
=
0
;
i
<
fsize
;
i
++
)
*
dci_pdu
|=
((
dci_pdu_rel15
->
frequency_domain_assignment
.
val
>>
(
fsize
-
i
-
1
))
&
1
)
<<
(
dci_size
-
pos
++
);
// Time domain assignment 4 bit
for
(
int
i
=
0
;
i
<
4
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
time_domain_assignment
.
val
>>
(
3
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// VRB to PRB mapping 1 bit
*
dci_pdu
|=
((
uint64_t
)
dci_pdu_rel15
->
vrb_to_prb_mapping
.
val
&
1
)
<<
(
dci_size
-
pos
++
);
// MCS 5bit //bit over 32, so dci_pdu ++
for
(
int
i
=
0
;
i
<
5
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
mcs
>>
(
4
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// Redundancy version 2bit
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
rv
>>
(
1
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
pos
=
1
;
// Freq domain assignment 0-16 bit
fsize
=
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
);
for
(
int
i
=
0
;
i
<
fsize
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
frequency_domain_assignment
.
val
>>
(
fsize
-
1
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// Time domain assignment 4 bit
for
(
int
i
=
0
;
i
<
4
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
time_domain_assignment
.
val
>>
(
3
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// VRB to PRB mapping 1 bit
*
dci_pdu
|=
((
uint64_t
)
dci_pdu_rel15
->
vrb_to_prb_mapping
.
val
&
1
)
<<
(
dci_size
-
pos
++
);
// MCS 5bit //bit over 32, so dci_pdu ++
for
(
int
i
=
0
;
i
<
5
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
mcs
>>
(
4
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// Redundancy version 2 bit
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
dci_pdu
|=
(((
uint64_t
)
dci_pdu_rel15
->
rv
>>
(
1
-
i
))
&
1
)
<<
(
dci_size
-
pos
++
);
// System information indicator 1bit
*
dci_pdu
|=
((
uint64_t
)
dci_pdu_rel15
->
system_info_indicator
&
1
)
<<
(
dci_size
-
pos
++
);
// reserved 15 bits
printf
(
"
\n\n
"
);
for
(
int
i
=
64
-
dci_size
;
i
<
64
;
i
++
)
{
printf
(
"%i "
,
(
*
dci_pdu
>>
63
-
i
)
&
(
uint64_t
)
0x01
);
}
printf
(
"
\n
dci_size = %i
\n
"
,
dci_size
);
printf
(
"fsize = %i
\n
"
,
fsize
);
printf
(
"dci_pdu_rel15->frequency_domain_assignment.val = %i
\n
"
,
dci_pdu_rel15
->
frequency_domain_assignment
.
val
);
printf
(
"dci_pdu_rel15->time_domain_assignment.val = %i
\n
"
,
dci_pdu_rel15
->
time_domain_assignment
.
val
);
printf
(
"dci_pdu_rel15->vrb_to_prb_mapping.val = %i
\n
"
,
dci_pdu_rel15
->
vrb_to_prb_mapping
.
val
);
printf
(
"dci_pdu_rel15->mcs = %i
\n
"
,
dci_pdu_rel15
->
mcs
);
printf
(
"dci_pdu_rel15->rv = %i
\n
"
,
dci_pdu_rel15
->
rv
);
printf
(
"dci_pdu_rel15->system_info_indicator = %i
\n
"
,
dci_pdu_rel15
->
system_info_indicator
);
printf
(
"
\n
"
);
break
;
case
NR_RNTI_TC
:
...
...
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