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
lizhongxiao
OpenXG-RAN
Commits
89fabbc2
Commit
89fabbc2
authored
Dec 28, 2023
by
francescomani
Committed by
Laurent THOMAS
Jan 14, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
RO MAC fields depending on bwp-id
parent
2e0b6f18
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
35 deletions
+46
-35
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+5
-5
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+7
-3
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+3
-2
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+31
-25
No files found.
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
89fabbc2
...
...
@@ -69,7 +69,7 @@
// ==========
#define NB_NR_UE_MAC_INST 1
#define MAX_NUM_BWP_UE
4
#define MAX_NUM_BWP_UE
5
#define NUM_SLOT_FRAME 10
/*!\brief value for indicating BSR Timer is not running */
...
...
@@ -461,13 +461,13 @@ typedef struct NR_UE_MAC_INST_s {
NR_MIB_t
*
mib
;
struct
NR_SI_SchedulingInfo
*
si_SchedulingInfo
;
int
si_window_start
;
ssb_list_info_t
ssb_list
;
prach_association_pattern_t
prach_assoc_pattern
;
ssb_list_info_t
ssb_list
[
MAX_NUM_BWP_UE
]
;
prach_association_pattern_t
prach_assoc_pattern
[
MAX_NUM_BWP_UE
]
;
NR_UE_ServingCell_Info_t
sc_info
;
A_SEQUENCE_OF
(
NR_UE_DL_BWP_t
)
dl_BWPs
;
A_SEQUENCE_OF
(
NR_UE_UL_BWP_t
)
ul_BWPs
;
NR_BWP_PDCCH_t
config_BWP_PDCCH
[
5
];
NR_BWP_PDCCH_t
config_BWP_PDCCH
[
MAX_NUM_BWP_UE
];
NR_UE_DL_BWP_t
*
current_DL_BWP
;
NR_UE_UL_BWP_t
*
current_UL_BWP
;
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
89fabbc2
...
...
@@ -74,6 +74,13 @@ void nr_ue_init_mac(module_id_t module_idP)
mac
->
servCellIndex
=
0
;
mac
->
harq_ACK_SpatialBundlingPUCCH
=
false
;
mac
->
harq_ACK_SpatialBundlingPUSCH
=
false
;
memset
(
&
mac
->
ssb_measurements
,
0
,
sizeof
(
mac
->
ssb_measurements
));
memset
(
&
mac
->
ul_time_alignment
,
0
,
sizeof
(
mac
->
ul_time_alignment
));
for
(
int
i
=
0
;
i
<
MAX_NUM_BWP_UE
;
i
++
)
{
memset
(
&
mac
->
ssb_list
[
i
],
0
,
sizeof
(
mac
->
ssb_list
[
i
]));
memset
(
&
mac
->
prach_assoc_pattern
[
i
],
0
,
sizeof
(
mac
->
prach_assoc_pattern
[
i
]));
}
}
void
nr_ue_mac_default_configs
(
NR_UE_MAC_INST_t
*
mac
)
...
...
@@ -103,9 +110,6 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac)
for
(
int
k
=
0
;
k
<
NR_MAX_HARQ_PROCESSES
;
k
++
)
mac
->
UL_ndi
[
k
]
=
-
1
;
// initialize to invalid value
}
memset
(
&
mac
->
ssb_measurements
,
0
,
sizeof
(
mac
->
ssb_measurements
));
memset
(
&
mac
->
ul_time_alignment
,
0
,
sizeof
(
mac
->
ul_time_alignment
));
}
NR_UE_MAC_INST_t
*
nr_l2_init_ue
()
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
View file @
89fabbc2
...
...
@@ -410,6 +410,7 @@ bool monitior_dci_for_other_SI(NR_UE_MAC_INST_t *mac,
return
false
;
const
int
si_window_slots
=
5
<<
si_SchedulingInfo
->
si_WindowLength
;
const
int
abs_slot
=
frame
*
slots_per_frame
+
slot
;
const
int
bwp_id
=
mac
->
current_DL_BWP
->
bwp_id
;
for
(
int
n
=
0
;
n
<
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
;
n
++
)
{
struct
NR_SchedulingInfo
*
sched_Info
=
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
n
];
if
(
mac
->
si_window_start
==
-
1
)
{
...
...
@@ -434,10 +435,10 @@ bool monitior_dci_for_other_SI(NR_UE_MAC_INST_t *mac,
get_monitoring_period_offset
(
ss
,
&
period
,
&
offset
);
for
(
int
i
=
0
;
i
<
duration
;
i
++
)
{
if
(((
frame
*
slots_per_frame
+
slot
-
offset
-
i
)
%
period
)
==
0
)
{
int
N
=
mac
->
ssb_list
.
nb_tx_ssb
;
int
N
=
mac
->
ssb_list
[
bwp_id
]
.
nb_tx_ssb
;
int
K
=
0
;
// k_th transmitted SSB
for
(
int
i
=
0
;
i
<
mac
->
mib_ssb
;
i
++
)
{
if
(
mac
->
ssb_list
.
tx_ssb
[
i
].
transmitted
)
if
(
mac
->
ssb_list
[
bwp_id
]
.
tx_ssb
[
i
].
transmitted
)
K
++
;
}
// numbering current frame and slot in terms of monitoring occasions in window
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
89fabbc2
...
...
@@ -1601,7 +1601,8 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac)
even_slot_invalid
=
false
;
}
// FR2 / FR1
prach_association_pattern_t
*
prach_assoc_pattern
=
&
mac
->
prach_assoc_pattern
;
const
int
bwp_id
=
mac
->
current_UL_BWP
->
bwp_id
;
prach_association_pattern_t
*
prach_assoc_pattern
=
&
mac
->
prach_assoc_pattern
[
bwp_id
];
prach_assoc_pattern
->
nb_of_prach_conf_period_in_max_period
=
MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD
/
x
;
nb_of_frames_per_prach_conf_period
=
x
;
...
...
@@ -1679,7 +1680,8 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac)
static
void
build_ssb_list
(
NR_UE_MAC_INST_t
*
mac
)
{
// Create the list of transmitted SSBs
ssb_list_info_t
*
ssb_list
=
&
mac
->
ssb_list
;
const
int
bwp_id
=
mac
->
current_UL_BWP
->
bwp_id
;
ssb_list_info_t
*
ssb_list
=
&
mac
->
ssb_list
[
bwp_id
];
fapi_nr_config_request_t
*
cfg
=
&
mac
->
phy_config
.
config_req
;
ssb_list
->
nb_tx_ssb
=
0
;
...
...
@@ -1749,6 +1751,9 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
}
LOG_D
(
NR_MAC
,
"SSB rach ratio %d, Multiple SSB per RO %d
\n
"
,
ssb_rach_ratio
,
multiple_ssb_per_ro
);
const
int
bwp_id
=
mac
->
current_UL_BWP
->
bwp_id
;
ssb_list_info_t
*
ssb_list
=
&
mac
->
ssb_list
[
bwp_id
];
// Evaluate the number of PRACH configuration periods required to map all the SSBs and set the association period
// WIP: Assumption for now is that all the PRACH configuration periods within a maximum association pattern period have the same
// number of PRACH occasions
...
...
@@ -1756,17 +1761,17 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
// There is only one possible association period which can contain up to 16 PRACH configuration periods
LOG_D
(
NR_MAC
,
"Evaluate the number of PRACH configuration periods required to map all the SSBs and set the association period
\n
"
);
if
(
true
==
multiple_ssb_per_ro
)
{
required_nb_of_prach_occasion
=
((
mac
->
ssb_list
.
nb_tx_ssb
-
1
)
+
ssb_rach_ratio
)
/
ssb_rach_ratio
;
required_nb_of_prach_occasion
=
((
ssb_list
->
nb_tx_ssb
-
1
)
+
ssb_rach_ratio
)
/
ssb_rach_ratio
;
}
else
{
required_nb_of_prach_occasion
=
mac
->
ssb_list
.
nb_tx_ssb
*
ssb_rach_ratio
;
required_nb_of_prach_occasion
=
ssb_list
->
nb_tx_ssb
*
ssb_rach_ratio
;
}
prach_association_pattern_t
*
prach_assoc_pattern
=
&
mac
->
prach_assoc_pattern
;
prach_association_pattern_t
*
prach_assoc_pattern
=
&
mac
->
prach_assoc_pattern
[
bwp_id
]
;
prach_association_period_t
*
prach_association_period_list
=
&
prach_assoc_pattern
->
prach_association_period_list
[
0
];
AssertFatal
(
prach_assoc_pattern
->
prach_conf_period_list
[
0
].
nb_of_prach_occasion
>
0
,
"prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion shouldn't be 0 (
ssb_list.nb_tx_ssb %d, ssb_rach_ratio %d
\n
"
,
mac
->
ssb_list
.
nb_tx_ssb
,
ssb_rach_ratio
);
"prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion shouldn't be 0 (
nb_tx_ssb %d, ssb_rach_ratio %d)
\n
"
,
ssb_list
->
nb_tx_ssb
,
ssb_rach_ratio
);
required_nb_of_prach_conf_period
=
((
required_nb_of_prach_occasion
-
1
)
+
prach_assoc_pattern
->
prach_conf_period_list
[
0
].
nb_of_prach_occasion
)
/
prach_assoc_pattern
->
prach_conf_period_list
[
0
].
nb_of_prach_occasion
;
...
...
@@ -1844,20 +1849,20 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
// this is true if no PRACH occasions are conflicting with SSBs nor TDD_UL_DL_ConfigurationCommon schedule
for
(;
ssb_idx
<
MAX_NB_SSB
;
ssb_idx
++
)
{
// Map only the transmitted ssb_idx
if
(
true
==
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
transmitted
)
{
if
(
true
==
ssb_list
->
tx_ssb
[
ssb_idx
].
transmitted
)
{
ro_p
->
mapped_ssb_idx
[
ro_p
->
nb_mapped_ssb
]
=
ssb_idx
;
ro_p
->
nb_mapped_ssb
++
;
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
mapped_ro
[
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
]
=
ro_p
;
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
++
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
ssb_list
->
tx_ssb
[
ssb_idx
].
mapped_ro
[
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
]
=
ro_p
;
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
++
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
"Too many mapped ROs (%d) to a single SSB
\n
"
,
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
LOG_D
(
NR_MAC
,
"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u
\n
"
,
ssb_idx
,
ro_p
->
slot
,
ro_p
->
start_symbol
,
slot
,
ro_in_time
,
ro_in_freq
,
prach_conf_period_p
->
prach_occasion_slot_map
[
frame
][
slot
].
nb_of_prach_occasion_in_freq
);
LOG_D
(
NR_MAC
,
"Nb mapped ROs for this ssb idx: in the association period only %u
\n
"
,
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
// If all the required SSBs are mapped to this RO, exit the loop of SSBs
if
(
ro_p
->
nb_mapped_ssb
==
ssb_rach_ratio
)
{
...
...
@@ -1902,10 +1907,10 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
for
(
ssb_idx
=
0
;
ssb_idx
<
MAX_NB_SSB
;
ssb_idx
++
)
{
uint8_t
nb_mapped_ro_in_association_period
=
0
;
// Reset the nb of mapped ROs for the new SSB index
LOG_D
(
NR_MAC
,
"Checking ssb_idx %d => %d
\n
"
,
ssb_idx
,
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
transmitted
);
ssb_idx
,
ssb_list
->
tx_ssb
[
ssb_idx
].
transmitted
);
// Map only the transmitted ssb_idx
if
(
true
==
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
transmitted
)
{
if
(
true
==
ssb_list
->
tx_ssb
[
ssb_idx
].
transmitted
)
{
// Map all the required ROs to this SSB
// Go through the list of PRACH config periods within this association period
...
...
@@ -1923,18 +1928,18 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
ro_p
->
mapped_ssb_idx
[
0
]
=
ssb_idx
;
ro_p
->
nb_mapped_ssb
=
1
;
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
mapped_ro
[
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
]
=
ro_p
;
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
++
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
ssb_list
->
tx_ssb
[
ssb_idx
].
mapped_ro
[
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
]
=
ro_p
;
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
++
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
"Too many mapped ROs (%d) to a single SSB
\n
"
,
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
);
nb_mapped_ro_in_association_period
++
;
LOG_D
(
NR_MAC
,
"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u
\n
"
,
ssb_idx
,
ro_p
->
slot
,
ro_p
->
start_symbol
,
slot
,
ro_in_time
,
ro_in_freq
,
prach_conf_period_p
->
prach_occasion_slot_map
[
frame
][
slot
].
nb_of_prach_occasion_in_freq
);
LOG_D
(
NR_MAC
,
"Nb mapped ROs for this ssb idx: in the association period only %u / total %u
\n
"
,
mac
->
ssb_list
.
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
nb_mapped_ro_in_association_period
);
ssb_list
->
tx_ssb
[
ssb_idx
].
nb_mapped_ro
,
nb_mapped_ro_in_association_period
);
// Exit the loop if this SSB has been mapped to all the required ROs
// WIP: Assuming that ssb_rach_ratio equals the maximum nb of times a given ssb_idx is mapped within an association period:
...
...
@@ -2064,8 +2069,9 @@ static int get_nr_prach_info_from_ssb_index(prach_association_pattern_t *prach_a
void
build_ssb_to_ro_map
(
NR_UE_MAC_INST_t
*
mac
)
{
// Clear all the lists and maps
memset
(
&
mac
->
prach_assoc_pattern
,
0
,
sizeof
(
prach_association_pattern_t
));
memset
(
&
mac
->
ssb_list
,
0
,
sizeof
(
ssb_list_info_t
));
const
int
bwp_id
=
mac
->
current_UL_BWP
->
bwp_id
;
memset
(
&
mac
->
ssb_list
[
bwp_id
],
0
,
sizeof
(
ssb_list_info_t
));
memset
(
&
mac
->
prach_assoc_pattern
[
bwp_id
],
0
,
sizeof
(
prach_association_pattern_t
));
// Build the list of all the valid RACH occasions in the maximum association pattern period according to the PRACH config
LOG_D
(
NR_MAC
,
"Build RO list
\n
"
);
...
...
@@ -2446,7 +2452,7 @@ static void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_fr
NR_RACH_ConfigCommon_t
*
setup
=
mac
->
current_UL_BWP
->
rach_ConfigCommon
;
NR_RACH_ConfigGeneric_t
*
rach_ConfigGeneric
=
&
setup
->
rach_ConfigGeneric
;
const
int
bwp_id
=
mac
->
current_UL_BWP
->
bwp_id
;
NR_TDD_UL_DL_ConfigCommon_t
*
tdd_config
=
mac
->
tdd_UL_DL_ConfigurationCommon
;
if
(
is_nr_UL_slot
(
tdd_config
,
slotP
,
mac
->
frame_type
))
{
...
...
@@ -2457,11 +2463,11 @@ static void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_fr
// Get any valid PRACH occasion in the current slot for the selected SSB index
prach_occasion_info_t
*
prach_occasion_info_p
;
int
is_nr_prach_slot
=
get_nr_prach_info_from_ssb_index
(
&
mac
->
prach_assoc_pattern
,
int
is_nr_prach_slot
=
get_nr_prach_info_from_ssb_index
(
&
mac
->
prach_assoc_pattern
[
bwp_id
]
,
selected_gnb_ssb_idx
,
(
int
)
frameP
,
(
int
)
slotP
,
&
mac
->
ssb_list
,
&
mac
->
ssb_list
[
bwp_id
]
,
&
prach_occasion_info_p
);
if
(
is_nr_prach_slot
)
{
...
...
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