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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
3bb6457f
Commit
3bb6457f
authored
Dec 28, 2023
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
RO MAC fields depending on bwp-id
parent
6302169d
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
48 additions
and
38 deletions
+48
-38
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
+33
-28
No files found.
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
3bb6457f
...
...
@@ -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_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 @
3bb6457f
...
...
@@ -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 @
3bb6457f
...
...
@@ -412,6 +412,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
)
{
...
...
@@ -436,10 +437,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 @
3bb6457f
...
...
@@ -1591,7 +1591,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
;
...
...
@@ -1666,11 +1667,11 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac)
}
// Build the list of all the valid/transmitted SSBs according to the config
static
void
build_ssb_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
;
...
...
@@ -1742,6 +1743,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
...
...
@@ -1749,17 +1753,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
;
...
...
@@ -1838,20 +1842,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
)
{
...
...
@@ -1896,10 +1900,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
...
...
@@ -1917,18 +1921,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:
...
...
@@ -2058,8 +2062,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
"
);
...
...
@@ -2457,7 +2462,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
))
{
...
...
@@ -2468,11 +2473,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