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
986a9fac
Commit
986a9fac
authored
Mar 16, 2021
by
rmagueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed issues to allow coexistence of CFRA and CBRA implementations
parent
8646dd0b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
191 additions
and
204 deletions
+191
-204
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
+4
-10
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+102
-122
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+2
-2
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+4
-2
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+27
-16
openair2/RRC/NR/rrc_gNB_reconfig.c
openair2/RRC/NR/rrc_gNB_reconfig.c
+52
-52
No files found.
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
View file @
986a9fac
...
...
@@ -146,17 +146,11 @@ int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t m
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
mod_id
);
NR_ServingCellConfigCommon_t
*
scc
=
mac
->
scc
;
int8_t
receivedTargerPower
,
delta_preamble
;
long
preambleReceivedTargetPower
=
0
;
if
(
prach_resources
->
RA_TYPE
==
RA_4STEP
){
NR_RACH_ConfigCommon_t
*
nr_rach_ConfigCommon
=
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
rach_ConfigCommon
->
choice
.
setup
;
preambleReceivedTargetPower
=
nr_rach_ConfigCommon
->
rach_ConfigGeneric
.
preambleReceivedTargetPower
;
}
else
if
(
prach_resources
->
RA_TYPE
==
RA_2STEP
){
// msgA-PreambleReceivedTargetPower
LOG_E
(
MAC
,
"In %s:%d: missing implementation for 2-step RA...
\n
"
,
__FUNCTION__
,
__LINE__
);
}
int8_t
receivedTargerPower
;
int8_t
delta_preamble
;
NR_RACH_ConfigCommon_t
*
nr_rach_ConfigCommon
=
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
rach_ConfigCommon
->
choice
.
setup
;
long
preambleReceivedTargetPower
=
nr_rach_ConfigCommon
->
rach_ConfigGeneric
.
preambleReceivedTargetPower
;
delta_preamble
=
nr_get_DELTA_PREAMBLE
(
mod_id
,
CC_id
,
prach_resources
->
prach_format
);
receivedTargerPower
=
preambleReceivedTargetPower
+
delta_preamble
+
(
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_COUNTER
-
1
)
*
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_STEP
+
prach_resources
->
POWER_OFFSET_2STEP_RA
;
...
...
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
View file @
986a9fac
...
...
@@ -103,150 +103,137 @@ void init_RA(module_id_t mod_id,
LOG_E
(
MAC
,
"In %s: config not handled
\n
"
,
__FUNCTION__
);
}
if
(
prach_resources
->
RA_TYPE
==
RA_2STEP
){
LOG_E
(
MAC
,
"Missing implementation of initialization of 2-step RA specific variables...
\n
"
);
}
else
if
(
prach_resources
->
RA_TYPE
==
RA_4STEP
){
LOG_D
(
MAC
,
"Initialization of 4-step RA specific variables...
\n
"
);
switch
(
rach_ConfigGeneric
->
powerRampingStep
){
// in dB
case
0
:
switch
(
rach_ConfigGeneric
->
powerRampingStep
){
// in dB
case
0
:
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_STEP
=
0
;
break
;
case
1
:
case
1
:
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_STEP
=
2
;
break
;
case
2
:
case
2
:
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_STEP
=
4
;
break
;
case
3
:
case
3
:
prach_resources
->
RA_PREAMBLE_POWER_RAMPING_STEP
=
6
;
break
;
}
}
switch
(
rach_ConfigGeneric
->
preambleTransMax
)
{
case
0
:
switch
(
rach_ConfigGeneric
->
preambleTransMax
)
{
case
0
:
ra
->
preambleTransMax
=
3
;
break
;
case
1
:
case
1
:
ra
->
preambleTransMax
=
4
;
break
;
case
2
:
case
2
:
ra
->
preambleTransMax
=
5
;
break
;
case
3
:
case
3
:
ra
->
preambleTransMax
=
6
;
break
;
case
4
:
case
4
:
ra
->
preambleTransMax
=
7
;
break
;
case
5
:
case
5
:
ra
->
preambleTransMax
=
8
;
break
;
case
6
:
case
6
:
ra
->
preambleTransMax
=
10
;
break
;
case
7
:
case
7
:
ra
->
preambleTransMax
=
20
;
break
;
case
8
:
case
8
:
ra
->
preambleTransMax
=
50
;
break
;
case
9
:
case
9
:
ra
->
preambleTransMax
=
100
;
break
;
case
10
:
case
10
:
ra
->
preambleTransMax
=
200
;
break
;
}
if
(
nr_rach_ConfigCommon
->
ext1
)
{
if
(
nr_rach_ConfigCommon
->
ext1
->
ra_PrioritizationForAccessIdentity
){
LOG_D
(
MAC
,
"In %s:%d: Missing implementation for Access Identity initialization procedures
\n
"
,
__FUNCTION__
,
__LINE__
);
}
}
}
return
;
if
(
nr_rach_ConfigCommon
->
ext1
)
{
if
(
nr_rach_ConfigCommon
->
ext1
->
ra_PrioritizationForAccessIdentity
){
LOG_D
(
MAC
,
"In %s:%d: Missing implementation for Access Identity initialization procedures
\n
"
,
__FUNCTION__
,
__LINE__
);
}
}
}
void
ssb_rach_config
(
RA_config_t
*
ra
,
NR_PRACH_RESOURCES_t
*
prach_resources
,
NR_RACH_ConfigCommon_t
*
nr_rach_ConfigCommon
,
fapi_nr_ul_config_prach_pdu
*
prach_pdu
){
// Determine the SSB to RACH mapping ratio
// =======================================
if
(
prach_resources
->
RA_TYPE
==
RA_4STEP
){
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
ssb_perRACH_config
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
present
;
boolean_t
multiple_ssb_per_ro
;
// true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
uint8_t
ssb_rach_ratio
;
// Nb of SSBs per RACH or RACHs per SSB
int
total_preambles_per_ssb
;
uint8_t
ssb_nb_in_ro
;
int
numberOfRA_Preambles
=
64
;
switch
(
ssb_perRACH_config
){
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneEighth
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
8
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneEighth
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneFourth
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
4
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneFourth
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneHalf
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
2
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneHalf
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
1
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
one
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
2
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
two
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_four
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
4
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
four
;
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_eight
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
8
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
eight
;
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_sixteen
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
16
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
sixteen
;
break
;
default:
AssertFatal
(
1
==
0
,
"Unsupported ssb_perRACH_config %d
\n
"
,
ssb_perRACH_config
);
break
;
}
if
(
nr_rach_ConfigCommon
->
totalNumberOfRA_Preambles
)
numberOfRA_Preambles
=
*
(
nr_rach_ConfigCommon
->
totalNumberOfRA_Preambles
);
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
ssb_perRACH_config
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
present
;
boolean_t
multiple_ssb_per_ro
;
// true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
uint8_t
ssb_rach_ratio
;
// Nb of SSBs per RACH or RACHs per SSB
int
total_preambles_per_ssb
;
uint8_t
ssb_nb_in_ro
;
int
numberOfRA_Preambles
=
64
;
switch
(
ssb_perRACH_config
){
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneEighth
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
8
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneEighth
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneFourth
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
4
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneFourth
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneHalf
:
multiple_ssb_per_ro
=
false
;
ssb_rach_ratio
=
2
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
oneHalf
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
1
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
one
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
2
;
ra
->
cb_preambles_per_ssb
=
4
*
(
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
two
+
1
);
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_four
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
4
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
four
;
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_eight
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
8
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
eight
;
break
;
case
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_sixteen
:
multiple_ssb_per_ro
=
true
;
ssb_rach_ratio
=
16
;
ra
->
cb_preambles_per_ssb
=
nr_rach_ConfigCommon
->
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
->
choice
.
sixteen
;
break
;
default:
AssertFatal
(
1
==
0
,
"Unsupported ssb_perRACH_config %d
\n
"
,
ssb_perRACH_config
);
}
// Compute the proper Preamble selection params according to the selected SSB and the ssb_perRACH_OccasionAndCB_PreamblesPerSSB configuration
if
((
true
==
multiple_ssb_per_ro
)
&&
(
ssb_rach_ratio
>
1
))
{
total_preambles_per_ssb
=
numberOfRA_Preambles
/
ssb_rach_ratio
;
if
(
nr_rach_ConfigCommon
->
totalNumberOfRA_Preambles
)
numberOfRA_Preambles
=
*
(
nr_rach_ConfigCommon
->
totalNumberOfRA_Preambles
);
ssb_nb_in_ro
=
prach_pdu
->
ssb_nb_in_ro
;
ra
->
starting_preamble_nb
=
total_preambles_per_ssb
*
ssb_nb_in_ro
;
}
else
{
total_preambles_per_ssb
=
numberOfRA_Preambles
;
ra
->
starting_preamble_nb
=
0
;
}
// Compute the proper Preamble selection params according to the selected SSB and the ssb_perRACH_OccasionAndCB_PreamblesPerSSB configuration
if
((
true
==
multiple_ssb_per_ro
)
&&
(
ssb_rach_ratio
>
1
))
{
total_preambles_per_ssb
=
numberOfRA_Preambles
/
ssb_rach_ratio
;
ssb_nb_in_ro
=
prach_pdu
->
ssb_nb_in_ro
;
ra
->
starting_preamble_nb
=
total_preambles_per_ssb
*
ssb_nb_in_ro
;
}
else
{
LOG_E
(
MAC
,
"In %s:%d: missing implementation for 2-step RA...
\n
"
,
__FUNCTION__
,
__LINE__
);
total_preambles_per_ssb
=
numberOfRA_Preambles
;
ra
->
starting_preamble_nb
=
0
;
}
}
// This routine implements RA pre
ma
ble configuration according to
// This routine implements RA pre
am
ble configuration according to
// section 5.1 (Random Access procedure) of 3GPP TS 38.321 version 16.2.1 Release 16
void
ra_preambles_config
(
NR_PRACH_RESOURCES_t
*
prach_resources
,
NR_UE_MAC_INST_t
*
mac
,
int16_t
dl_pathloss
){
...
...
@@ -261,23 +248,21 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t
NR_RACH_ConfigCommon_t
*
nr_rach_ConfigCommon
=
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
rach_ConfigCommon
->
choice
.
setup
;
NR_RACH_ConfigGeneric_t
*
rach_ConfigGeneric
=
&
nr_rach_ConfigCommon
->
rach_ConfigGeneric
;
if
(
prach_resources
->
RA_TYPE
==
RA_4STEP
){
if
(
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
){
deltaPreamble_Msg3
=
(
*
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
)
*
2
;
// dB
LOG_D
(
MAC
,
"In %s: deltaPreamble_Msg3 set to %ld
\n
"
,
__FUNCTION__
,
deltaPreamble_Msg3
);
}
if
(
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
){
deltaPreamble_Msg3
=
(
*
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
)
*
2
;
// dB
LOG_D
(
MAC
,
"In %s: deltaPreamble_Msg3 set to %ld
\n
"
,
__FUNCTION__
,
deltaPreamble_Msg3
);
}
if
(
!
nr_rach_ConfigCommon
->
groupBconfigured
)
{
noGroupB
=
1
;
LOG_D
(
MAC
,
"In %s:%d: preambles group B is not configured...
\n
"
,
__FUNCTION__
,
__LINE__
);
}
else
{
// RA preambles group B is configured
// - Random Access Preambles group B is configured for 4-step RA type
// - Defining the number of RA preambles in RA Preamble Group A for each SSB
LOG_D
(
MAC
,
"In %s:%d: preambles group B is configured...
\n
"
,
__FUNCTION__
,
__LINE__
);
sizeOfRA_PreamblesGroupA
=
nr_rach_ConfigCommon
->
groupBconfigured
->
numberOfRA_PreamblesGroupA
;
switch
(
nr_rach_ConfigCommon
->
groupBconfigured
->
ra_Msg3SizeGroupA
){
if
(
!
nr_rach_ConfigCommon
->
groupBconfigured
)
{
noGroupB
=
1
;
LOG_D
(
MAC
,
"In %s:%d: preambles group B is not configured...
\n
"
,
__FUNCTION__
,
__LINE__
);
}
else
{
// RA preambles group B is configured
// - Random Access Preambles group B is configured for 4-step RA type
// - Defining the number of RA preambles in RA Preamble Group A for each SSB
LOG_D
(
MAC
,
"In %s:%d: preambles group B is configured...
\n
"
,
__FUNCTION__
,
__LINE__
);
sizeOfRA_PreamblesGroupA
=
nr_rach_ConfigCommon
->
groupBconfigured
->
numberOfRA_PreamblesGroupA
;
switch
(
nr_rach_ConfigCommon
->
groupBconfigured
->
ra_Msg3SizeGroupA
){
/* - Threshold to determine the groups of RA preambles */
case
0
:
messageSizeGroupA
=
56
;
...
...
@@ -343,17 +328,12 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t
break
;
default:
AssertFatal
(
1
==
0
,
"Unknown messagePowerOffsetGroupB %lu
\n
"
,
nr_rach_ConfigCommon
->
groupBconfigured
->
messagePowerOffsetGroupB
);
}
}
PLThreshold
=
prach_resources
->
RA_PCMAX
-
rach_ConfigGeneric
->
preambleReceivedTargetPower
-
deltaPreamble_Msg3
-
messagePowerOffsetGroupB
;
PLThreshold
=
prach_resources
->
RA_PCMAX
-
rach_ConfigGeneric
->
preambleReceivedTargetPower
-
deltaPreamble_Msg3
-
messagePowerOffsetGroupB
;
}
}
else
{
// todo:
// - groupB-ConfiguredTwoStepRA
// - msgA-DeltaPreamble
LOG_E
(
MAC
,
"In %s:%d: missing implementation for 2-step RA...
\n
"
,
__FUNCTION__
,
__LINE__
);
}
/* Msg3 has not been transmitted yet */
if
(
ra
->
first_Msg3
)
{
if
(
ra
->
ra_PreambleIndex
<
0
||
ra
->
ra_PreambleIndex
>
63
)
{
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
986a9fac
...
...
@@ -891,13 +891,12 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
uint16_t
TBS_bytes
=
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
tb_size
;
if
(
ra
->
ra_state
==
WAIT_RAR
){
if
(
ra
->
ra_state
==
WAIT_RAR
&&
!
ra
->
cfra
){
memcpy
(
ulsch_input_buffer
,
mac
->
ulsch_pdu
.
payload
,
TBS_bytes
);
LOG_D
(
NR_MAC
,
"[RAPROC] Msg3 to be transmitted:
\n
"
);
for
(
int
k
=
0
;
k
<
TBS_bytes
;
k
++
)
{
LOG_D
(
NR_MAC
,
"(%i): 0x%x
\n
"
,
k
,
mac
->
ulsch_pdu
.
payload
[
k
]);
}
LOG_I
(
NR_MAC
,
"[RAPROC] RA-Msg3 transmitted
\n
"
);
}
else
{
if
(
IS_SOFTMODEM_NOS1
&&
(
mac
->
UL_ndi
[
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
harq_process_id
]
!=
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
new_data_indicator
)){
// Getting IP traffic to be transmitted
...
...
@@ -947,6 +946,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
tx_req
.
tx_request_body
[
0
].
pdu
=
ulsch_input_buffer
;
if
(
ra
->
ra_state
!=
RA_SUCCEEDED
&&
!
ra
->
cfra
){
LOG_I
(
NR_MAC
,
"[RAPROC] RA-Msg3 transmitted
\n
"
);
nr_Msg3_transmitted
(
ul_info
->
module_id
,
ul_info
->
cc_id
,
ul_info
->
frame_tx
,
ul_info
->
gNB_index
);
}
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
986a9fac
...
...
@@ -1033,7 +1033,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
nr_get_Msg3alloc
(
module_idP
,
CC_id
,
scc
,
ubwp
,
slotP
,
frameP
,
ra
);
nr_add_msg3
(
module_idP
,
CC_id
,
frameP
,
slotP
,
ra
,
(
uint8_t
*
)
&
tx_req
->
TLVs
[
0
].
value
.
direct
[
0
]);
LOG_I
(
MAC
,
"Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d
\n
"
,
frameP
,
slotP
,
ra
->
Msg3_frame
,
ra
->
Msg3_slot
);
if
(
ra
->
cfra
)
{
LOG_I
(
MAC
,
"Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d
\n
"
,
frameP
,
slotP
,
ra
->
Msg3_frame
,
ra
->
Msg3_slot
);
}
T
(
T_GNB_MAC_DL_RAR_PDU_WITH_DATA
,
T_INT
(
module_idP
),
T_INT
(
CC_id
),
T_INT
(
ra
->
RA_rnti
),
T_INT
(
frameP
),
T_INT
(
slotP
),
T_INT
(
0
),
T_BUFFER
(
&
tx_req
->
TLVs
[
0
].
value
.
direct
[
0
],
tx_req
->
TLVs
[
0
].
length
));
...
...
@@ -1364,7 +1366,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
nr_clear_ra_proc
(
module_id
,
CC_id
,
frame
,
ra
);
free
(
ra
->
preambles
.
preamble_list
);
UE_info
->
active
[
UE_id
]
=
true
;
LOG_I
(
NR_MAC
,
"(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. RA procedure succeeded!
\n
"
,
UE_id
,
ra
->
rnti
);
LOG_I
(
NR_MAC
,
"(ue %i, rnti 0x%04x) Received Ack of RA-Msg4.
CB
RA procedure succeeded!
\n
"
,
UE_id
,
ra
->
rnti
);
}
else
{
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
986a9fac
...
...
@@ -513,26 +513,37 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
UE_id
,
ra
->
rnti
);
LOG_I
(
NR_MAC
,
"[RAPROC] RA-Msg3 received
\n
"
);
LOG_D
(
NR_MAC
,
"[RAPROC] Received Msg3:
\n
"
);
for
(
int
k
=
0
;
k
<
sdu_lenP
;
k
++
)
{
LOG_D
(
NR_MAC
,
"(%i): 0x%x
\n
"
,
k
,
sduP
[
k
]);
}
if
(
ra
->
cfra
)
{
LOG_I
(
NR_MAC
,
"(ue %i, rnti 0x%04x) CFRA procedure succeeded!
\n
"
,
UE_id
,
ra
->
rnti
);
nr_clear_ra_proc
(
gnb_mod_idP
,
CC_idP
,
frameP
,
ra
);
free
(
ra
->
preambles
.
preamble_list
);
UE_info
->
active
[
UE_id
]
=
true
;
}
else
{
// UE Contention Resolution Identity
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4
// First byte corresponds to R/LCID MAC sub-header
memcpy
(
ra
->
cont_res_id
,
&
sduP
[
1
],
sizeof
(
uint8_t
)
*
6
);
LOG_I
(
NR_MAC
,
"[RAPROC] RA-Msg3 received
\n
"
);
LOG_I
(
NR_MAC
,
"[RAPROC] Received Msg3:
\n
"
);
for
(
int
k
=
0
;
k
<
sdu_lenP
;
k
++
)
{
LOG_I
(
NR_MAC
,
"(%i): 0x%x
\n
"
,
k
,
sduP
[
k
]);
}
// re-initialize ta update variables afrer RA procedure completion
UE_info
->
UE_sched_ctrl
[
UE_id
].
ta_frame
=
frameP
;
// UE Contention Resolution Identity
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4
// First byte corresponds to R/LCID MAC sub-header
memcpy
(
ra
->
cont_res_id
,
&
sduP
[
1
],
sizeof
(
uint8_t
)
*
6
);
nr_process_mac_pdu
(
gnb_mod_idP
,
current_rnti
,
CC_idP
,
frameP
,
sduP
,
sdu_lenP
);
// re-initialize ta update variables afrer RA procedure completion
UE_info
->
UE_sched_ctrl
[
UE_id
].
ta_frame
=
frameP
;
ra
->
state
=
Msg4
;
ra
->
Msg4_frame
=
(
frameP
+
2
)
%
1024
;
ra
->
Msg4_slot
=
1
;
LOG_I
(
MAC
,
"Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)
\n
"
,
ra
->
rnti
,
ra
->
state
,
ra
->
Msg4_frame
,
ra
->
Msg4_slot
);
nr_process_mac_pdu
(
gnb_mod_idP
,
current_rnti
,
CC_idP
,
frameP
,
sduP
,
sdu_lenP
);
ra
->
state
=
Msg4
;
ra
->
Msg4_frame
=
(
frameP
+
2
)
%
1024
;
ra
->
Msg4_slot
=
1
;
LOG_I
(
MAC
,
"Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)
\n
"
,
ra
->
rnti
,
ra
->
state
,
ra
->
Msg4_frame
,
ra
->
Msg4_slot
);
}
return
;
}
...
...
openair2/RRC/NR/rrc_gNB_reconfig.c
View file @
986a9fac
...
...
@@ -228,58 +228,58 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
ext1
=
NULL
;
// For 2-step contention-free random access procedure
#if 0
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink= calloc(1,sizeof(struct NR_RACH_ConfigDedicated));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra= calloc(1,sizeof(struct NR_CFRA));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization= NULL;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions= calloc(1,sizeof(struct NR_CFRA__occasions));
memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric,
&servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= calloc(1,sizeof(long));
*secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion = NR_CFRA__occasions__ssb_perRACH_Occasion_one;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0;
struct NR_CFRA_SSB_Resource *ssbElem[8];
ssbElem[0] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[0]->ssb = 0;
ssbElem[0]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[0]);
ssbElem[1] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[1]->ssb = 1;
ssbElem[1]->ra_PreambleIndex = 62;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[1]);
ssbElem[2] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[2]->ssb = 2;
ssbElem[2]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[2]);
ssbElem[3] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[3]->ssb = 3;
ssbElem[3]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[3]);
ssbElem[4] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[4]->ssb = 4;
ssbElem[4]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[4]);
ssbElem[5] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[5]->ssb = 5;
ssbElem[5]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[5]);
ssbElem[6] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[6]->ssb = 6;
ssbElem[6]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[6]);
ssbElem[7] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
ssbElem[7]->ssb = 7;
ssbElem[7]->ra_PreambleIndex = 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[7]);
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL;
#endif
if
(
get_softmodem_params
()
->
sa
==
0
)
{
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
=
calloc
(
1
,
sizeof
(
struct
NR_ReconfigurationWithSync__rach_ConfigDedicated
));
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
present
=
NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink
;
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
=
calloc
(
1
,
sizeof
(
struct
NR_RACH_ConfigDedicated
));
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA
));
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
ra_Prioritization
=
NULL
;
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
occasions
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA__occasions
));
memcpy
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
occasions
->
rach_ConfigGeneric
,
&
servingcellconfigcommon
->
uplinkConfigCommon
->
initialUplinkBWP
->
rach_ConfigCommon
->
choice
.
setup
->
rach_ConfigGeneric
,
sizeof
(
NR_RACH_ConfigGeneric_t
));
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
occasions
->
ssb_perRACH_Occasion
=
calloc
(
1
,
sizeof
(
long
));
*
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
occasions
->
ssb_perRACH_Occasion
=
NR_CFRA__occasions__ssb_perRACH_Occasion_one
;
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
present
=
NR_CFRA__resources_PR_ssb
;
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA__resources__ssb
));
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ra_ssb_OccasionMaskIndex
=
0
;
struct
NR_CFRA_SSB_Resource
*
ssbElem
[
8
];
ssbElem
[
0
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
0
]
->
ssb
=
0
;
ssbElem
[
0
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
0
]);
ssbElem
[
1
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
1
]
->
ssb
=
1
;
ssbElem
[
1
]
->
ra_PreambleIndex
=
62
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
1
]);
ssbElem
[
2
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
2
]
->
ssb
=
2
;
ssbElem
[
2
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
2
]);
ssbElem
[
3
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
3
]
->
ssb
=
3
;
ssbElem
[
3
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
3
]);
ssbElem
[
4
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
4
]
->
ssb
=
4
;
ssbElem
[
4
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
4
]);
ssbElem
[
5
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
5
]
->
ssb
=
5
;
ssbElem
[
5
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
5
]);
ssbElem
[
6
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
6
]
->
ssb
=
6
;
ssbElem
[
6
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
6
]);
ssbElem
[
7
]
=
calloc
(
1
,
sizeof
(
struct
NR_CFRA_SSB_Resource
));
ssbElem
[
7
]
->
ssb
=
7
;
ssbElem
[
7
]
->
ra_PreambleIndex
=
63
;
ASN_SEQUENCE_ADD
(
&
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
,
ssbElem
[
7
]);
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
ext1
=
NULL
;
}
secondaryCellGroup
->
spCellConfig
->
rlf_TimersAndConstants
=
calloc
(
1
,
sizeof
(
*
secondaryCellGroup
->
spCellConfig
->
rlf_TimersAndConstants
));
secondaryCellGroup
->
spCellConfig
->
rlf_TimersAndConstants
->
present
=
NR_SetupRelease_RLF_TimersAndConstants_PR_setup
;
...
...
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