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
4adaa03f
Commit
4adaa03f
authored
Feb 19, 2024
by
Laurent THOMAS
Committed by
laurent
Feb 23, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
continue ro map
parent
684c5dff
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
41 additions
and
50 deletions
+41
-50
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+1
-1
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+1
-2
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+12
-4
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+1
-6
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+26
-37
No files found.
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
View file @
4adaa03f
...
...
@@ -430,7 +430,7 @@ typedef struct prach_occasion_info {
// PRACH occasion slot details
// A PRACH occasion slot is a series of PRACH occasions in time (symbols) and frequency
typedef
struct
prach_occasion_slot
{
prach_occasion_info_t
prach_occasion
[
MAX_TDM
][
MAX_FDM
]
;
// Starting symbol of each PRACH occasions in a slot
prach_occasion_info_t
*
prach_occasion
;
// Starting symbol of each PRACH occasions in a slot
uint8_t
nb_of_prach_occasion_in_time
;
uint8_t
nb_of_prach_occasion_in_freq
;
}
prach_occasion_slot_t
;
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
4adaa03f
...
...
@@ -426,14 +426,13 @@ typedef struct prach_association_pattern {
// SSB details
typedef
struct
ssb_info
{
bool
transmitted
;
// True if the SSB index is transmitted according to the SSB positions map configuration
prach_occasion_info_t
*
mapped_ro
[
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
];
// List of mapped RACH Occasions to this SSB index
uint32_t
nb_mapped_ro
;
// Total number of mapped ROs to this SSB index
}
ssb_info_t
;
// List of all the possible SSBs and their details
typedef
struct
ssb_list_info
{
ssb_info_t
tx_ssb
[
MAX_NB_SSB
]
;
ssb_info_t
*
tx_ssb
;
uint8_t
nb_tx_ssb
;
}
ssb_list_info_t
;
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
4adaa03f
...
...
@@ -69,10 +69,8 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac)
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
]));
}
memset
(
mac
->
ssb_list
,
0
,
sizeof
(
mac
->
ssb_list
));
memset
(
mac
->
prach_assoc_pattern
,
0
,
sizeof
(
mac
->
prach_assoc_pattern
));
for
(
int
k
=
0
;
k
<
NR_MAX_HARQ_PROCESSES
;
k
++
)
{
mac
->
ul_harq_info
[
k
].
last_ndi
=
-
1
;
// initialize to invalid value
mac
->
dl_harq_info
[
k
].
last_ndi
=
-
1
;
// initialize to invalid value
...
...
@@ -186,7 +184,17 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
// release, if any, Temporary C-RNTI
nr_mac
->
ra
.
t_crnti
=
0
;
// free RACH structs
for
(
int
i
=
0
;
i
<
MAX_NUM_BWP_UE
;
i
++
)
{
free
(
nr_mac
->
ssb_list
[
i
].
tx_ssb
);
for
(
int
j
=
0
;
j
<
MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD
;
j
++
)
for
(
int
k
=
0
;
k
<
MAX_NB_FRAME_IN_PRACH_CONF_PERIOD
;
k
++
)
for
(
int
l
=
0
;
l
<
MAX_NB_SLOT_IN_FRAME
;
l
++
)
free
(
nr_mac
->
prach_assoc_pattern
[
i
].
prach_conf_period_list
[
j
].
prach_occasion_slot_map
[
k
][
l
].
prach_occasion
);
}
// memset(mac->ssb_list, 0, sizeof(mac->ssb_list));
// memset(mac->prach_assoc_pattern, 0, sizeof(mac->prach_assoc_pattern));
// reset BFI_COUNTER
// TODO beam failure procedure not implemented
}
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
View file @
4adaa03f
...
...
@@ -436,15 +436,10 @@ bool monitior_dci_for_other_SI(NR_UE_MAC_INST_t *mac,
for
(
int
i
=
0
;
i
<
duration
;
i
++
)
{
if
(((
frame
*
slots_per_frame
+
slot
-
offset
-
i
)
%
period
)
==
0
)
{
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
[
bwp_id
].
tx_ssb
[
i
].
transmitted
)
K
++
;
}
// numbering current frame and slot in terms of monitoring occasions in window
int
current_monitor_occasion
=
((
abs_slot
-
mac
->
si_window_start
)
%
period
)
+
(
duration
*
(
abs_slot
-
mac
->
si_window_start
)
/
period
);
if
(
current_monitor_occasion
%
N
==
K
)
if
(
current_monitor_occasion
<
N
)
return
true
;
else
return
false
;
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
4adaa03f
...
...
@@ -1736,19 +1736,19 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac)
prach_occasion_slot_t
*
slot_map
=
&
prach_conf_period_list
->
prach_occasion_slot_map
[
frame_idx
][
slot
];
slot_map
->
nb_of_prach_occasion_in_time
=
N_t_slot
;
slot_map
->
nb_of_prach_occasion_in_freq
=
nb_fdm
;
slot_map
->
prach_occasion
=
malloc
(
N_t_slot
*
nb_fdm
*
sizeof
(
*
slot_map
->
prach_occasion
));
AssertFatal
(
slot_map
->
prach_occasion
,
"no memory available
\n
"
);
for
(
int
n_prach_occ_in_time
=
0
;
n_prach_occ_in_time
<
N_t_slot
;
n_prach_occ_in_time
++
)
{
uint8_t
start_symbol
=
prach_conf_start_symbol
+
n_prach_occ_in_time
*
N_dur
;
LOG_D
(
NR_MAC
,
"PRACH Occ in time %d
\n
"
,
n_prach_occ_in_time
);
for
(
int
n_prach_occ_in_freq
=
0
;
n_prach_occ_in_freq
<
nb_fdm
;
n_prach_occ_in_freq
++
)
{
prach_occasion_info_t
*
prach_occasion_p
=
&
slot_map
->
prach_occasion
[
n_prach_occ_in_time
][
n_prach_occ_in_freq
];
prach_occasion_p
->
start_symbol
=
start_symbol
;
prach_occasion_p
->
fdm
=
n_prach_occ_in_freq
;
prach_occasion_p
->
frame
=
frame
;
prach_occasion_p
->
slot
=
slot
;
prach_occasion_p
->
format
=
format
;
slot_map
->
prach_occasion
[
n_prach_occ_in_time
*
nb_fdm
+
n_prach_occ_in_freq
]
=
(
prach_occasion_info_t
){.
start_symbol
=
start_symbol
,
.
fdm
=
n_prach_occ_in_freq
,
.
frame
=
frame
,
.
slot
=
slot
,
.
format
=
format
};
prach_assoc_pattern
->
prach_conf_period_list
[
period_idx
].
nb_of_prach_occasion
++
;
LOG_D
(
NR_MAC
,
"Adding a PRACH occasion: frame %u, slot-symbol %d-%d, occ_in_time-occ_in-freq %d-%d, nb ROs in conf period %d, for this slot: RO# in time %d, RO# in freq %d
\n
"
,
...
...
@@ -1773,17 +1773,13 @@ static void build_ssb_list(NR_UE_MAC_INST_t *mac)
fapi_nr_config_request_t
*
cfg
=
&
mac
->
phy_config
.
config_req
;
ssb_list
->
nb_tx_ssb
=
0
;
for
(
int
ssb_index
=
0
;
ssb_index
<
64
;
ssb_index
++
)
{
for
(
int
ssb_index
=
0
;
ssb_index
<
MAX_NB_SSB
;
ssb_index
++
)
{
uint32_t
curr_mask
=
cfg
->
ssb_table
.
ssb_mask_list
[
ssb_index
/
32
].
ssb_mask
;
// check if if current SSB is transmitted
if
((
curr_mask
>>
(
31
-
(
ssb_index
%
32
)))
&
0x01
)
{
if
((
curr_mask
>>
(
31
-
(
ssb_index
%
32
)))
&
0x01
)
ssb_list
->
nb_tx_ssb
++
;
ssb_list
->
tx_ssb
[
ssb_index
].
transmitted
=
true
;
LOG_D
(
NR_MAC
,
"SSB idx %d transmitted
\n
"
,
ssb_index
);
}
else
ssb_list
->
tx_ssb
[
ssb_index
].
transmitted
=
false
;
}
ssb_list
->
tx_ssb
=
calloc
(
ssb_list
->
nb_tx_ssb
,
sizeof
(
*
ssb_list
->
tx_ssb
));
}
// Map the transmitted SSBs to the ROs and create the association pattern according to the config
...
...
@@ -1890,15 +1886,14 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
prach_occasion_slot_t
*
slot_map
=
&
prach_conf
->
prach_occasion_slot_map
[
frame
][
slot
];
for
(
int
ro_in_time
=
0
;
ro_in_time
<
slot_map
->
nb_of_prach_occasion_in_time
&&
!
done
;
ro_in_time
++
)
{
for
(
int
ro_in_freq
=
0
;
ro_in_freq
<
slot_map
->
nb_of_prach_occasion_in_freq
&&
!
done
;
ro_in_freq
++
)
{
prach_occasion_info_t
*
ro_p
=
&
slot_map
->
prach_occasion
[
ro_in_time
][
ro_in_freq
];
prach_occasion_info_t
*
ro_p
=
slot_map
->
prach_occasion
+
ro_in_time
*
slot_map
->
nb_of_prach_occasion_in_freq
+
ro_in_freq
;
// Go through the list of transmitted SSBs and map the required amount of SSBs to this RO
// WIP: For the moment, only map each SSB idx once per association period if configuration is multiple SSBs per RO
// 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
++
)
{
for
(;
ssb_idx
<
ssb_list
->
nb_tx_ssb
;
ssb_idx
++
)
{
ssb_info_t
*
tx_ssb
=
ssb_list
->
tx_ssb
+
ssb_idx
;
// Map only the transmitted ssb_idx
if
(
!
tx_ssb
->
transmitted
)
continue
;
ro_p
->
mapped_ssb_idx
[
ro_p
->
nb_mapped_ssb
]
=
ssb_idx
;
ro_p
->
nb_mapped_ssb
++
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
tx_ssb
->
nb_mapped_ro
+
1
,
...
...
@@ -1933,17 +1928,10 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
for
(
prach_association_period_t
*
prach_period
=
prach_assoc_pattern
->
prach_association_period_list
;
prach_period
<
end
;
prach_period
++
)
{
// Go through the list of transmitted SSBs
for
(
int
ssb_idx
=
0
;
ssb_idx
<
MAX_NB_SSB
;
ssb_idx
++
)
{
for
(
int
ssb_idx
=
0
;
ssb_idx
<
ssb_list
->
nb_tx_ssb
;
ssb_idx
++
)
{
ssb_info_t
*
tx_ssb
=
ssb_list
->
tx_ssb
+
ssb_idx
;
uint8_t
nb_mapped_ro_in_association_period
=
0
;
// Reset the nb of mapped ROs for the new SSB index
bool
done
=
false
;
LOG_D
(
NR_MAC
,
"Checking ssb_idx %d => %d
\n
"
,
ssb_idx
,
tx_ssb
->
transmitted
);
// Map only the transmitted ssb_idx
if
(
!
tx_ssb
->
transmitted
)
continue
;
// Map all the required ROs to this SSB
// Go through the list of PRACH config periods within this association period
for
(
int
i
=
0
;
i
<
prach_period
->
nb_of_prach_conf_period
&&
!
done
;
i
++
)
{
...
...
@@ -1955,7 +1943,8 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
prach_occasion_slot_t
*
slot_map
=
&
prach_conf
->
prach_occasion_slot_map
[
frame
][
slot
];
for
(
int
ro_in_time
=
0
;
ro_in_time
<
slot_map
->
nb_of_prach_occasion_in_time
&&
!
done
;
ro_in_time
++
)
{
for
(
int
ro_in_freq
=
0
;
ro_in_freq
<
slot_map
->
nb_of_prach_occasion_in_freq
&&
!
done
;
ro_in_freq
++
)
{
prach_occasion_info_t
*
ro_p
=
&
slot_map
->
prach_occasion
[
ro_in_time
][
ro_in_freq
];
prach_occasion_info_t
*
ro_p
=
slot_map
->
prach_occasion
+
ro_in_time
*
slot_map
->
nb_of_prach_occasion_in_freq
+
ro_in_freq
;
ro_p
->
mapped_ssb_idx
[
0
]
=
ssb_idx
;
ro_p
->
nb_mapped_ssb
=
1
;
AssertFatal
(
MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN
>
tx_ssb
->
nb_mapped_ro
+
1
,
...
...
@@ -2034,10 +2023,10 @@ static int get_nr_prach_info_from_ssb_index(prach_association_pattern_t *prach_a
for
(
int
ro_in_time
=
0
;
ro_in_time
<
prach_occasion_slot_p
->
nb_of_prach_occasion_in_time
;
ro_in_time
++
)
{
for
(
int
ro_in_freq
=
0
;
ro_in_freq
<
prach_occasion_slot_p
->
nb_of_prach_occasion_in_freq
;
ro_in_freq
++
)
{
prach_occasion_info_t
*
prach_occasion_info_p
=
&
prach_occasion_slot_p
->
prach_occasion
[
ro_in_time
][
ro_in_freq
];
for
(
uint8_t
ssb_nb
=
0
;
ssb_nb
<
prach_occasion_inf
o_p
->
nb_mapped_ssb
;
ssb_nb
++
)
{
if
(
prach_occasion_inf
o_p
->
mapped_ssb_idx
[
ssb_nb
]
==
ssb_idx
)
{
prach_occasion_info_t
*
ro_p
=
prach_occasion_slot_p
->
prach_occasion
+
ro_in_time
*
prach_occasion_slot_p
->
nb_of_prach_occasion_in_freq
+
ro_in_freq
;
for
(
uint8_t
ssb_nb
=
0
;
ssb_nb
<
r
o_p
->
nb_mapped_ssb
;
ssb_nb
++
)
{
if
(
r
o_p
->
mapped_ssb_idx
[
ssb_nb
]
==
ssb_idx
)
{
nb_mapped_ssb
++
;
}
}
...
...
@@ -2053,12 +2042,12 @@ static int get_nr_prach_info_from_ssb_index(prach_association_pattern_t *prach_a
nb_mapped_ssb
=
0
;
for
(
int
ro_in_time
=
0
;
ro_in_time
<
prach_occasion_slot_p
->
nb_of_prach_occasion_in_time
;
ro_in_time
++
)
{
for
(
int
ro_in_freq
=
0
;
ro_in_freq
<
prach_occasion_slot_p
->
nb_of_prach_occasion_in_freq
;
ro_in_freq
++
)
{
prach_occasion_info_t
*
prach_occasion_info_p
=
&
prach_occasion_slot_p
->
prach_occasion
[
ro_in_time
][
ro_in_freq
];
for
(
uint8_t
ssb_nb
=
0
;
ssb_nb
<
prach_occasion_inf
o_p
->
nb_mapped_ssb
;
ssb_nb
++
)
{
if
(
prach_occasion_inf
o_p
->
mapped_ssb_idx
[
ssb_nb
]
==
ssb_idx
)
{
prach_occasion_info_t
*
ro_p
=
prach_occasion_slot_p
->
prach_occasion
+
ro_in_time
*
prach_occasion_slot_p
->
nb_of_prach_occasion_in_freq
+
ro_in_freq
;
for
(
uint8_t
ssb_nb
=
0
;
ssb_nb
<
r
o_p
->
nb_mapped_ssb
;
ssb_nb
++
)
{
if
(
r
o_p
->
mapped_ssb_idx
[
ssb_nb
]
==
ssb_idx
)
{
if
(
nb_mapped_ssb
==
random_ssb_nb
)
{
*
prach_occasion_info_pp
=
prach_occasion_inf
o_p
;
*
prach_occasion_info_pp
=
r
o_p
;
return
1
;
}
else
{
...
...
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