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
OpenXG
OpenXG UE
Commits
d5cc796e
Commit
d5cc796e
authored
Oct 15, 2020
by
kn.raju
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modified mapping of SSB index to UE_id
parent
fb42a6a1
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
216 additions
and
135 deletions
+216
-135
openair2/LAYER2/NR_MAC_gNB/config.c
openair2/LAYER2/NR_MAC_gNB/config.c
+29
-15
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+66
-57
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+42
-17
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+79
-46
No files found.
openair2/LAYER2/NR_MAC_gNB/config.c
View file @
d5cc796e
...
...
@@ -46,6 +46,9 @@
#include "NR_MIB.h"
#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
/* Softmodem params */
#include "executables/softmodem-common.h"
extern
RAN_CONTEXT_t
RC
;
//extern int l2_init_gNB(void);
extern
void
mac_top_init_gNB
(
void
);
...
...
@@ -360,22 +363,33 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
if
(
secondaryCellGroup
)
{
NR_UE_
list_t
*
UE_list
=
&
RC
.
nrmac
[
Mod_idP
]
->
UE_list
;
i
nt
UE_id
;
if
(
add_ue
==
1
)
{
UE_i
d
=
add_new_nr_ue
(
Mod_idP
,
rnti
)
;
UE_list
->
secondaryCellGroup
[
UE_id
]
=
secondaryCellGroup
;
uint8_t
num_preamble
=
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
.
coun
t
;
UE_list
->
preambles
[
UE_id
].
num_preambles
=
num_preamble
;
UE_list
->
preambles
[
UE_id
].
preamble_list
=
(
uint8_t
*
)
malloc
(
num_preamble
*
sizeof
(
uint8_t
));
for
(
int
i
=
0
;
i
<
num_preamble
;
i
++
)
{
UE_list
->
preambles
[
UE_id
].
preamble_list
[
i
]
=
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
.
array
[
i
]
->
ra_PreambleIndex
;
}
NR_UE_
info_t
*
UE_info
=
&
RC
.
nrmac
[
Mod_idP
]
->
UE_info
;
i
f
(
add_ue
==
1
&&
get_softmodem_params
()
->
phy_test
)
{
const
int
UE_id
=
add_new_nr_ue
(
Mod_idP
,
rnti
);
UE_i
nfo
->
secondaryCellGroup
[
UE_id
]
=
secondaryCellGroup
;
struct
NR_ServingCellConfig__downlinkBWP_ToAddModList
*
bwpList
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModLis
t
;
AssertFatal
(
bwpList
->
list
.
count
==
1
,
"downlinkBWP_ToAddModList has %d BWP!
\n
"
,
bwpList
->
list
.
count
);
const
int
bwp_id
=
1
;
UE_info
->
UE_sched_ctrl
[
UE_id
].
active_bwp
=
bwpList
->
list
.
array
[
bwp_id
-
1
];
LOG_I
(
PHY
,
"Added new UE_id %d/%x with initial secondaryCellGroup
\n
"
,
UE_id
,
rnti
);
}
else
{
// secondaryCellGroup has been updated
UE_id
=
find_nr_UE_id
(
Mod_idP
,
rnti
);
UE_list
->
secondaryCellGroup
[
UE_id
]
=
secondaryCellGroup
;
}
else
if
(
add_ue
==
1
&&
!
get_softmodem_params
()
->
phy_test
)
{
const
int
CC_id
=
0
;
NR_RA_t
*
ra
=
&
RC
.
nrmac
[
Mod_idP
]
->
common_channels
[
CC_id
].
ra
[
0
];
ra
->
state
=
RA_IDLE
;
ra
->
secondaryCellGroup
=
secondaryCellGroup
;
ra
->
crnti
=
rnti
;
uint8_t
num_preamble
=
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
.
count
;
ra
->
preambles
.
num_preambles
=
num_preamble
;
ra
->
preambles
.
preamble_list
=
(
uint8_t
*
)
malloc
(
num_preamble
*
sizeof
(
uint8_t
));
for
(
int
i
=
0
;
i
<
num_preamble
;
i
++
)
ra
->
preambles
.
preamble_list
[
i
]
=
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
->
cfra
->
resources
.
choice
.
ssb
->
ssb_ResourceList
.
list
.
array
[
i
]
->
ra_PreambleIndex
;
LOG_I
(
PHY
,
"Added new RA process for UE RNTI %04x with initial secondaryCellGroup
\n
"
,
rnti
);
}
else
{
// secondaryCellGroup has been updated
const
int
UE_id
=
find_nr_UE_id
(
Mod_idP
,
rnti
);
UE_info
->
secondaryCellGroup
[
UE_id
]
=
secondaryCellGroup
;
LOG_I
(
PHY
,
"Modified UE_id %d/%x with secondaryCellGroup
\n
"
,
UE_id
,
rnti
);
}
}
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
d5cc796e
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
d5cc796e
...
...
@@ -212,7 +212,7 @@ void nr_process_mac_pdu(
LOG_D
(
MAC
,
"[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)
\n
"
,
module_idP
,
frameP
,
rx_lcid
,
module_idP
,
mac_sdu_len
);
int
UE_id
=
find_nr_UE_id
(
module_idP
,
rnti
);
RC
.
nrmac
[
module_idP
]
->
UE_
list
.
mac_stats
[
UE_id
].
lc_bytes_rx
[
rx_lcid
]
+=
mac_sdu_len
;
RC
.
nrmac
[
module_idP
]
->
UE_
info
.
mac_stats
[
UE_id
].
lc_bytes_rx
[
rx_lcid
]
+=
mac_sdu_len
;
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
LOG_T
(
MAC
,
"[UE %d] First 32 bytes of DLSCH :
\n
"
,
module_idP
);
...
...
@@ -313,19 +313,19 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
const
uint16_t
rssi
){
int
current_rnti
=
0
,
UE_id
=
-
1
,
harq_pid
=
0
;
gNB_MAC_INST
*
gNB_mac
=
NULL
;
NR_UE_
list_t
*
UE_list
=
NULL
;
NR_UE_
info_t
*
UE_info
=
NULL
;
NR_UE_sched_ctrl_t
*
UE_scheduling_control
=
NULL
;
current_rnti
=
rntiP
;
UE_id
=
find_nr_UE_id
(
gnb_mod_idP
,
current_rnti
);
gNB_mac
=
RC
.
nrmac
[
gnb_mod_idP
];
UE_
list
=
&
gNB_mac
->
UE_list
;
UE_
info
=
&
gNB_mac
->
UE_info
;
int
target_snrx10
=
gNB_mac
->
pusch_target_snrx10
;
if
(
UE_id
!=
-
1
)
{
UE_scheduling_control
=
&
(
UE_
list
->
UE_sched_ctrl
[
UE_id
]);
UE_scheduling_control
=
&
(
UE_
info
->
UE_sched_ctrl
[
UE_id
]);
UE_
list
->
mac_stats
[
UE_id
].
ulsch_total_bytes_rx
+=
sdu_lenP
;
UE_
info
->
mac_stats
[
UE_id
].
ulsch_total_bytes_rx
+=
sdu_lenP
;
LOG_D
(
MAC
,
"[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d
\n
"
,
gnb_mod_idP
,
harq_pid
,
...
...
@@ -366,20 +366,45 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
}
}
else
{
else
if
(
sduP
!=
NULL
)
{
// if the CRC passed
// random access pusch with TC-RNTI
if
(
sduP
!=
NULL
)
{
// if the CRC passed
for
(
int
i
=
0
;
i
<
MAX_MOBILES_PER_GNB
;
i
++
)
{
if
(
UE_list
->
active
[
i
]
==
TRUE
)
{
if
(
UE_list
->
tc_rnti
[
i
]
==
current_rnti
)
{
// for now the only thing we are doing is set the UE as 5G connected
UE_list
->
fiveG_connected
[
i
]
=
true
;
LOG_I
(
MAC
,
"[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly and UE_id %d is now 5G connected
\n
"
,
gnb_mod_idP
,
current_rnti
,
i
);
}
}
}
NR_RA_t
*
ra
=
&
gNB_mac
->
common_channels
[
CC_idP
].
ra
[
0
];
if
(
ra
->
state
!=
WAIT_Msg3
)
{
LOG_E
(
MAC
,
"expected RA state WAIT_Msg3/%d (but is %d) for RA-RNTI %04x
\n
"
,
WAIT_Msg3
,
ra
->
state
,
ra
->
rnti
);
return
;
}
if
(
ra
->
rnti
!=
current_rnti
)
{
LOG_E
(
MAC
,
"expected RA-RNTI %04x (C-RNTI %04x) to match current RNTI %04x
\n
"
,
ra
->
rnti
,
ra
->
crnti
,
current_rnti
);
return
;
}
free
(
ra
->
preambles
.
preamble_list
);
ra
->
state
=
RA_IDLE
;
LOG_I
(
MAC
,
"reset RA state information for RA-RNTI %04x
\n
"
,
ra
->
rnti
);
const
int
UE_id
=
add_new_nr_ue
(
gnb_mod_idP
,
ra
->
crnti
);
UE_info
->
secondaryCellGroup
[
UE_id
]
=
ra
->
secondaryCellGroup
;
UE_info
->
UE_beam_index
[
UE_id
]
=
ra
->
beam_id
;
struct
NR_ServingCellConfig__downlinkBWP_ToAddModList
*
bwpList
=
ra
->
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
;
AssertFatal
(
bwpList
->
list
.
count
==
1
,
"downlinkBWP_ToAddModList has %d BWP!
\n
"
,
bwpList
->
list
.
count
);
const
int
bwp_id
=
1
;
UE_info
->
UE_sched_ctrl
[
UE_id
].
active_bwp
=
bwpList
->
list
.
array
[
bwp_id
-
1
];
LOG_W
(
MAC
,
"[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
"adding UE MAC Context UE_id %d/RNTI %04x
\n
"
,
gnb_mod_idP
,
current_rnti
,
UE_id
,
ra
->
crnti
);
}
}
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
d5cc796e
...
...
@@ -74,6 +74,7 @@
#define MAX_NUM_CCE 90
/*!\brief Maximum number of random access process */
#define NR_NB_RA_PROC_MAX 4
#define MAX_NUM_OF_SSB 64
typedef
enum
{
RA_IDLE
=
0
,
...
...
@@ -83,6 +84,11 @@ typedef enum {
WAIT_Msg4_ACK
=
4
}
RA_gNB_state_t
;
typedef
struct
NR_preamble_ue
{
uint8_t
num_preambles
;
uint8_t
*
preamble_list
;
}
NR_preamble_ue_t
;
/*! \brief gNB template for the Random access information */
typedef
struct
{
/// Flag to indicate this process is active
...
...
@@ -141,8 +147,14 @@ typedef struct {
int
msg4_mcs
;
/// RA search space
NR_SearchSpace_t
*
ra_ss
;
// SSB id
uint8_t
ssb_id
;
// Beam index
uint8_t
beam_id
;
/// secondaryCellGroup for UE in NSA that is to come
NR_CellGroupConfig_t
*
secondaryCellGroup
;
/// Preambles for contention-free access
NR_preamble_ue_t
preambles
;
/// NSA: the UEs C-RNTI to use
rnti_t
crnti
;
}
NR_RA_t
;
/*! \brief gNB common channels */
...
...
@@ -174,19 +186,21 @@ typedef struct {
/// Template for RA computations
NR_RA_t
ra
[
NR_NB_RA_PROC_MAX
];
/// VRB map for common channels
uint8_t
vrb_map
[
100
];
uint8_t
vrb_map
[
275
];
/// VRB map for common channels and retransmissions by PHICH
uint8_t
vrb_map_UL
[
100
];
uint8_t
vrb_map_UL
[
275
];
/// number of subframe allocation pattern available for MBSFN sync area
uint8_t
num_sf_allocation_pattern
;
///Number of active SSBs
uint8_t
num_active_ssb
;
//Total available prach occasions per configuration period
uint32_t
total_prach_occasions_per_config_period
;
//Total available prach occasions
uint32_t
total_prach_occasions
;
//Max Association period
uint8_t
max_association_period
;
///Number of active SSBs
uint8_t
num_active_ssb
;
//Total available prach occasions per configuration period
uint32_t
total_prach_occasions_per_config_period
;
//Total available prach occasions
uint32_t
total_prach_occasions
;
//Max Association period
uint8_t
max_association_period
;
//SSB index
uint8_t
ssb_index
[
MAX_NUM_OF_SSB
];
}
NR_COMMON_channels_t
;
...
...
@@ -278,6 +292,14 @@ typedef struct NR_UE_harq {
uint16_t
feedback_slot
;
}
NR_UE_harq_t
;
typedef
struct
NR_UE_old_sched
{
uint16_t
rbSize
;
int
time_domain_allocation
;
uint8_t
mcsTableIdx
;
uint8_t
mcs
;
uint8_t
numDmrsCdmGrpsNoData
;
}
NR_UE_ret_info_t
;
typedef
enum
{
INACTIVE
=
0
,
ACTIVE_NOT_SCHED
,
...
...
@@ -293,10 +315,39 @@ typedef struct NR_UE_ul_harq {
/*! \brief scheduling control information set through an API */
typedef
struct
{
uint64_t
dlsch_in_slot_bitmap
;
// static bitmap signaling which slot in a tdd period contains dlsch
uint64_t
ulsch_in_slot_bitmap
;
// static bitmap signaling which slot in a tdd period contains ulsch
/// total amount of data awaiting for this UE
uint32_t
num_total_bytes
;
/// per-LC status data
mac_rlc_status_resp_t
rlc_status
[
MAX_NUM_LCID
];
/// the currently active BWP in DL
NR_BWP_Downlink_t
*
active_bwp
;
NR_sched_pucch
*
sched_pucch
;
/// selected PUCCH index, if scheduled
int
pucch_sched_idx
;
NR_sched_pusch
*
sched_pusch
;
/// CCE index and aggregation, should be coherent with cce_list
NR_SearchSpace_t
*
search_space
;
NR_ControlResourceSet_t
*
coreset
;
int
cce_index
;
uint8_t
aggregation_level
;
/// RB allocation within active BWP
uint16_t
rbSize
;
uint16_t
rbStart
;
// time-domain allocation for scheduled RBs
int
time_domain_allocation
;
/// MCS-related infos
uint8_t
mcsTableIdx
;
uint8_t
mcs
;
uint8_t
numDmrsCdmGrpsNoData
;
/// Retransmission-related information
NR_UE_ret_info_t
retInfo
[
NR_MAX_NB_HARQ_PROCESSES
];
uint16_t
ta_timer
;
int16_t
ta_update
;
bool
ta_apply
;
...
...
@@ -310,11 +361,6 @@ typedef struct {
NR_UE_mac_ce_ctrl_t
UE_mac_ce_ctrl
;
// MAC CE related information
}
NR_UE_sched_ctrl_t
;
typedef
struct
NR_preamble_ue
{
uint8_t
num_preambles
;
uint8_t
*
preamble_list
;
}
NR_preamble_ue
;
typedef
struct
{
int
lc_bytes_tx
[
64
];
...
...
@@ -328,40 +374,28 @@ typedef struct {
int
ulsch_total_bytes_rx
;
}
NR_mac_stats_t
;
/*! \brief UNR_E_list_t is a "list" of users within UE_info_t. Especial useful in
* the scheduler and to keep "classes" of users. */
typedef
struct
{
int
head
;
int
next
[
MAX_MOBILES_PER_GNB
];
}
NR_UE_list_t
;
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
typedef
struct
{
DLSCH_PDU
DLSCH_pdu
[
4
][
MAX_MOBILES_PER_GNB
];
/// scheduling control info
NR_UE_sched_ctrl_t
UE_sched_ctrl
[
MAX_MOBILES_PER_GNB
];
NR_mac_stats_t
mac_stats
[
MAX_MOBILES_PER_GNB
];
int
next
[
MAX_MOBILES_PER_GNB
];
int
head
;
int
next_ul
[
MAX_MOBILES_PER_GNB
];
int
head_ul
;
int
avail
;
NR_UE_list_t
list
;
int
num_UEs
;
boolean_t
active
[
MAX_MOBILES_PER_GNB
];
boolean_t
fiveG_connected
[
MAX_MOBILES_PER_GNB
];
bool
active
[
MAX_MOBILES_PER_GNB
];
rnti_t
rnti
[
MAX_MOBILES_PER_GNB
];
rnti_t
tc_rnti
[
MAX_MOBILES_PER_GNB
];
NR_preamble_ue
preambles
[
MAX_MOBILES_PER_GNB
];
NR_CellGroupConfig_t
*
secondaryCellGroup
[
MAX_MOBILES_PER_GNB
];
uint8_t
UE_ssb_index
[
MAX_MOBILES_PER_GNB
];
}
NR_UE_list_t
;
typedef
struct
{
rnti_t
rnti
;
rnti_t
tc_rnti
;
boolean_t
active
;
}
NR_SSB_UE_list_t
;
#define MAX_NUM_OF_SSB 64
typedef
struct
{
uint8_t
ssb_index
;
int
num_UEs
;
NR_SSB_UE_list_t
SSB_UE_list
[
MAX_MOBILES_PER_GNB
];
}
NR_SSB_list_t
;
// UE selected beam index
uint8_t
UE_beam_index
[
MAX_MOBILES_PER_GNB
];
}
NR_UE_info_t
;
/*! \brief top level eNB MAC structure */
typedef
struct
gNB_MAC_INST_s
{
...
...
@@ -395,9 +429,8 @@ typedef struct gNB_MAC_INST_s {
/// NFAPI DL PDU structure
nfapi_nr_tx_data_request_t
TX_req
[
NFAPI_CC_MAX
];
NR_UE_
list_t
UE_list
;
NR_UE_
info_t
UE_info
;
NR_SSB_list_t
SSB_list
[
MAX_NUM_OF_SSB
];
/// UL handle
uint32_t
ul_handle
;
...
...
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