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
c0d123b9
Commit
c0d123b9
authored
Oct 28, 2020
by
Shweta Shrivastava
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support for multiple PDUs in a UL slot
parent
661dd531
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
124 additions
and
120 deletions
+124
-120
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+2
-1
openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+2
-2
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+4
-4
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+115
-112
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
+1
-1
No files found.
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
View file @
c0d123b9
...
...
@@ -23,6 +23,7 @@
#include "PHY/impl_defs_nr.h"
#define NFAPI_UE_MAX_NUM_CB 8
#define NFAPI_MAX_NUM_UL_PDU 8
/*
typedef unsigned int uint32_t;
...
...
@@ -155,7 +156,7 @@ typedef struct {
uint16_t
slot
;
fapi_nr_tx_config_t
tx_config
;
uint16_t
number_of_pdus
;
fapi_nr_tx_request_body_t
*
tx_request_body
;
fapi_nr_tx_request_body_t
tx_request_body
[
NFAPI_MAX_NUM_UL_PDU
]
;
}
fapi_nr_tx_request_t
;
/// This struct replaces:
...
...
openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
View file @
c0d123b9
...
...
@@ -154,8 +154,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
ulsch0
->
f_pusch
=
pusch_config_pdu
->
absolute_delta_PUSCH
;
if
(
scheduled_response
->
tx_request
){
// TBR todo here it should loop through the number of tx pdus
fapi_nr_tx_request_body_t
*
tx_req_body
=
scheduled_response
->
tx_request
->
tx_request_body
;
if
(
scheduled_response
->
tx_request
){
fapi_nr_tx_request_body_t
*
tx_req_body
=
&
scheduled_response
->
tx_request
->
tx_request_body
[
i
]
;
memcpy
(
harq_process_ul_ue
->
a
,
tx_req_body
->
pdu
,
tx_req_body
->
pdu_length
);
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
c0d123b9
...
...
@@ -57,10 +57,10 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
if
(
IS_SOFTMODEM_NOS1
){
if
(
rlc_module_init
(
0
)
!=
0
)
{
LOG_I
(
RLC
,
"Problem at RLC initiation
\n
"
);
}
pdcp_layer_init
();
nr_DRB_preconfiguration
();
LOG_I
(
RLC
,
"Problem at RLC initiation
\n
"
);
}
pdcp_layer_init
();
nr_DRB_preconfiguration
();
}
// Allocate memory for ul_config_request in the mac instance. This is now a pointer and will
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
c0d123b9
...
...
@@ -852,116 +852,119 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
// program PUSCH with UL DCI parameters
nr_scheduled_response_t
scheduled_response
;
fapi_nr_tx_request_t
tx_req
;
fapi_nr_tx_request_body_t
tx_req_body
;
nfapi_nr_ue_ptrs_ports_t
ptrs_ports_list
;
fapi_nr_ul_config_request_pdu_t
*
ulcfg_pdu
=
&
ul_config_req
->
ul_config_list
[
0
];
// These should come from RRC config!!!
uint8_t
ptrs_mcs1
=
2
;
uint8_t
ptrs_mcs2
=
4
;
uint8_t
ptrs_mcs3
=
10
;
uint16_t
n_rb0
=
25
;
uint16_t
n_rb1
=
75
;
uint8_t
ptrs_time_density
=
get_L_ptrs
(
ptrs_mcs1
,
ptrs_mcs2
,
ptrs_mcs3
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
uint8_t
ptrs_freq_density
=
get_K_ptrs
(
n_rb0
,
n_rb1
,
ulcfg_pdu
->
pusch_config_pdu
.
rb_size
);
uint16_t
l_prime_mask
=
get_l_prime
(
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
,
typeB
,
pusch_dmrs_pos0
,
pusch_len1
);
uint16_t
ul_dmrs_symb_pos
=
l_prime_mask
<<
ulcfg_pdu
->
pusch_config_pdu
.
start_symbol_index
;
uint8_t
dmrs_config_type
=
0
;
uint16_t
number_dmrs_symbols
=
0
;
// PTRS ports configuration
// TbD: ptrs_dmrs_port and ptrs_port_index are not initialised!
ptrs_ports_list
.
ptrs_re_offset
=
0
;
// Num PRB Overhead from PUSCH-ServingCellConfig
if
(
mac
->
scg
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
xOverhead
==
NULL
)
N_PRB_oh
=
0
;
else
N_PRB_oh
=
*
mac
->
scg
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
xOverhead
;
ulcfg_pdu
->
pusch_config_pdu
.
ul_dmrs_symb_pos
=
ul_dmrs_symb_pos
;
ulcfg_pdu
->
pusch_config_pdu
.
dmrs_config_type
=
dmrs_config_type
;
ulcfg_pdu
->
pusch_config_pdu
.
num_dmrs_cdm_grps_no_data
=
1
;
ulcfg_pdu
->
pusch_config_pdu
.
nrOfLayers
=
1
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
new_data_indicator
=
0
;
ulcfg_pdu
->
pusch_config_pdu
.
pdu_bit_map
=
PUSCH_PDU_BITMAP_PUSCH_DATA
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_time_density
=
ptrs_time_density
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_freq_density
=
ptrs_freq_density
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_ports_list
=
&
ptrs_ports_list
;
ulcfg_pdu
->
pusch_config_pdu
.
target_code_rate
=
nr_get_code_rate_ul
(
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
ulcfg_pdu
->
pusch_config_pdu
.
qam_mod_order
=
nr_get_Qm_ul
(
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
if
(
1
<<
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_time_density
>=
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
)
{
ulcfg_pdu
->
pusch_config_pdu
.
pdu_bit_map
&=
~
PUSCH_PDU_BITMAP_PUSCH_PTRS
;
// disable PUSCH PTRS
}
get_num_re_dmrs
(
&
ulcfg_pdu
->
pusch_config_pdu
,
&
nb_dmrs_re_per_rb
,
&
number_dmrs_symbols
);
TBS
=
nr_compute_tbs
(
ulcfg_pdu
->
pusch_config_pdu
.
qam_mod_order
,
ulcfg_pdu
->
pusch_config_pdu
.
target_code_rate
,
ulcfg_pdu
->
pusch_config_pdu
.
rb_size
,
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
,
nb_dmrs_re_per_rb
*
number_dmrs_symbols
,
N_PRB_oh
,
0
,
ulcfg_pdu
->
pusch_config_pdu
.
nrOfLayers
);
TBS_bytes
=
TBS
/
8
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
tb_size
=
TBS_bytes
;
if
(
IS_SOFTMODEM_NOS1
){
// Getting IP traffic to be transmitted
data_existing
=
nr_ue_get_sdu
(
mod_id
,
cc_id
,
frame_tx
,
slot_tx
,
0
,
ulsch_input_buffer
,
TBS_bytes
,
&
access_mode
);
}
//Random traffic to be transmitted if there is no IP traffic available for this Tx opportunity
if
(
!
IS_SOFTMODEM_NOS1
||
!
data_existing
)
{
//Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
//and block this traffic from being forwarded to the upper layers at the gNB
LOG_D
(
PHY
,
"Random data to be tranmsitted:
\n
"
);
//Give the first byte a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
//in order to distinguish the PHY random packets at the MAC layer of the gNB receiver from the normal packets that should
//have a valid LCID (nr_process_mac_pdu function)
ulsch_input_buffer
[
0
]
=
0x31
;
for
(
i
=
1
;
i
<
TBS_bytes
;
i
++
)
{
ulsch_input_buffer
[
i
]
=
(
unsigned
char
)
rand
();
//printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
for
(
int
j
=
0
;
j
<
ul_config_req
->
number_pdus
;
j
++
)
{
fapi_nr_ul_config_request_pdu_t
*
ulcfg_pdu
=
&
ul_config_req
->
ul_config_list
[
j
];
if
(
ulcfg_pdu
->
pdu_type
==
FAPI_NR_UL_CONFIG_TYPE_PUSCH
)
{
// These should come from RRC config!!!
uint8_t
ptrs_mcs1
=
2
;
uint8_t
ptrs_mcs2
=
4
;
uint8_t
ptrs_mcs3
=
10
;
uint16_t
n_rb0
=
25
;
uint16_t
n_rb1
=
75
;
uint8_t
ptrs_time_density
=
get_L_ptrs
(
ptrs_mcs1
,
ptrs_mcs2
,
ptrs_mcs3
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
uint8_t
ptrs_freq_density
=
get_K_ptrs
(
n_rb0
,
n_rb1
,
ulcfg_pdu
->
pusch_config_pdu
.
rb_size
);
uint16_t
l_prime_mask
=
get_l_prime
(
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
,
typeB
,
pusch_dmrs_pos0
,
pusch_len1
);
uint16_t
ul_dmrs_symb_pos
=
l_prime_mask
<<
ulcfg_pdu
->
pusch_config_pdu
.
start_symbol_index
;
uint8_t
dmrs_config_type
=
0
;
uint16_t
number_dmrs_symbols
=
0
;
// PTRS ports configuration
// TbD: ptrs_dmrs_port and ptrs_port_index are not initialised!
ptrs_ports_list
.
ptrs_re_offset
=
0
;
// Num PRB Overhead from PUSCH-ServingCellConfig
if
(
mac
->
scg
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
xOverhead
==
NULL
)
N_PRB_oh
=
0
;
else
N_PRB_oh
=
*
mac
->
scg
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
xOverhead
;
ulcfg_pdu
->
pusch_config_pdu
.
ul_dmrs_symb_pos
=
ul_dmrs_symb_pos
;
ulcfg_pdu
->
pusch_config_pdu
.
dmrs_config_type
=
dmrs_config_type
;
ulcfg_pdu
->
pusch_config_pdu
.
num_dmrs_cdm_grps_no_data
=
1
;
ulcfg_pdu
->
pusch_config_pdu
.
nrOfLayers
=
1
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
new_data_indicator
=
0
;
ulcfg_pdu
->
pusch_config_pdu
.
pdu_bit_map
=
PUSCH_PDU_BITMAP_PUSCH_DATA
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_time_density
=
ptrs_time_density
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_freq_density
=
ptrs_freq_density
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_ports_list
=
&
ptrs_ports_list
;
ulcfg_pdu
->
pusch_config_pdu
.
target_code_rate
=
nr_get_code_rate_ul
(
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
ulcfg_pdu
->
pusch_config_pdu
.
qam_mod_order
=
nr_get_Qm_ul
(
ulcfg_pdu
->
pusch_config_pdu
.
mcs_index
,
ulcfg_pdu
->
pusch_config_pdu
.
mcs_table
);
if
(
1
<<
ulcfg_pdu
->
pusch_config_pdu
.
pusch_ptrs
.
ptrs_time_density
>=
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
)
{
ulcfg_pdu
->
pusch_config_pdu
.
pdu_bit_map
&=
~
PUSCH_PDU_BITMAP_PUSCH_PTRS
;
// disable PUSCH PTRS
}
get_num_re_dmrs
(
&
ulcfg_pdu
->
pusch_config_pdu
,
&
nb_dmrs_re_per_rb
,
&
number_dmrs_symbols
);
TBS
=
nr_compute_tbs
(
ulcfg_pdu
->
pusch_config_pdu
.
qam_mod_order
,
ulcfg_pdu
->
pusch_config_pdu
.
target_code_rate
,
ulcfg_pdu
->
pusch_config_pdu
.
rb_size
,
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
,
nb_dmrs_re_per_rb
*
number_dmrs_symbols
,
N_PRB_oh
,
0
,
ulcfg_pdu
->
pusch_config_pdu
.
nrOfLayers
);
TBS_bytes
=
TBS
/
8
;
ulcfg_pdu
->
pusch_config_pdu
.
pusch_data
.
tb_size
=
TBS_bytes
;
if
(
IS_SOFTMODEM_NOS1
){
// Getting IP traffic to be transmitted
data_existing
=
nr_ue_get_sdu
(
mod_id
,
cc_id
,
frame_tx
,
slot_tx
,
0
,
ulsch_input_buffer
,
TBS_bytes
,
&
access_mode
);
}
//Random traffic to be transmitted if there is no IP traffic available for this Tx opportunity
if
(
!
IS_SOFTMODEM_NOS1
||
!
data_existing
)
{
//Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
//and block this traffic from being forwarded to the upper layers at the gNB
LOG_D
(
PHY
,
"Random data to be tranmsitted:
\n
"
);
//Give the first byte a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
//in order to distinguish the PHY random packets at the MAC layer of the gNB receiver from the normal packets that should
//have a valid LCID (nr_process_mac_pdu function)
ulsch_input_buffer
[
0
]
=
0x31
;
for
(
i
=
1
;
i
<
TBS_bytes
;
i
++
)
{
ulsch_input_buffer
[
i
]
=
(
unsigned
char
)
rand
();
//printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
}
}
#ifdef DEBUG_MAC_PDU
LOG_D
(
PHY
,
"Is data existing ?: %d
\n
"
,
data_existing
);
LOG_I
(
PHY
,
"Printing MAC PDU to be encoded, TBS is: %d
\n
"
,
TBS_bytes
);
for
(
i
=
0
;
i
<
TBS_bytes
;
i
++
)
{
printf
(
"%02x"
,
ulsch_input_buffer
[
i
]);
}
printf
(
"
\n
"
);
#endif
// Config UL TX PDU
tx_req
.
slot
=
slot_tx
;
tx_req
.
sfn
=
frame_tx
;
// tx_req->tx_config // TbD
tx_req
.
number_of_pdus
++
;
tx_req
.
tx_request_body
[
j
].
pdu_length
=
TBS_bytes
;
tx_req
.
tx_request_body
[
j
].
pdu_index
=
j
;
tx_req
.
tx_request_body
[
j
].
pdu
=
ulsch_input_buffer
;
}
}
#ifdef DEBUG_MAC_PDU
LOG_D
(
PHY
,
"Is data existing ?: %d
\n
"
,
data_existing
);
LOG_I
(
PHY
,
"Printing MAC PDU to be encoded, TBS is: %d
\n
"
,
TBS_bytes
);
for
(
i
=
0
;
i
<
TBS_bytes
;
i
++
)
{
printf
(
"%02x"
,
ulsch_input_buffer
[
i
]);
}
printf
(
"
\n
"
);
#endif
// Config UL TX PDU
tx_req
.
slot
=
slot_tx
;
tx_req
.
sfn
=
frame_tx
;
// tx_req->tx_config // TbD
tx_req
.
number_of_pdus
=
1
;
tx_req_body
.
pdu_length
=
TBS_bytes
;
tx_req_body
.
pdu_index
=
0
;
tx_req_body
.
pdu
=
ulsch_input_buffer
;
tx_req
.
tx_request_body
=
&
tx_req_body
;
fill_scheduled_response
(
&
scheduled_response
,
NULL
,
ul_config_req
,
&
tx_req
,
mod_id
,
cc_id
,
rx_frame
,
rx_slot
);
if
(
mac
->
if_module
!=
NULL
&&
mac
->
if_module
->
scheduled_response
!=
NULL
){
mac
->
if_module
->
scheduled_response
(
&
scheduled_response
);
...
...
@@ -983,8 +986,8 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
uint8_t
ulsch_input_buffer
[
MAX_ULSCH_PAYLOAD_BYTES
];
nr_scheduled_response_t
scheduled_response
;
fapi_nr_tx_request_t
tx_req
;
fapi_nr_tx_request_body_t
tx_req_body
;
fapi_nr_ul_config_request_t
*
ul_config
=
get_ul_config_request
(
mac
,
ul_info
->
slot_tx
)
;
//fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, ul_info->slot_tx)
;
fapi_nr_ul_config_request_t
*
ul_config
=
&
mac
->
ul_config_request
[
0
]
;
fapi_nr_ul_config_request_pdu_t
*
ul_config_list
=
&
ul_config
->
ul_config_list
[
ul_config
->
number_pdus
];
uint16_t
TBS_bytes
=
ul_config_list
->
pusch_config_pdu
.
pusch_data
.
tb_size
;
...
...
@@ -1025,10 +1028,9 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
tx_req
.
slot
=
ul_info
->
slot_tx
;
tx_req
.
sfn
=
ul_info
->
frame_tx
;
tx_req
.
number_of_pdus
=
1
;
tx_req_body
.
pdu_length
=
TBS_bytes
;
tx_req_body
.
pdu_index
=
0
;
tx_req_body
.
pdu
=
ulsch_input_buffer
;
tx_req
.
tx_request_body
=
&
tx_req_body
;
tx_req
.
tx_request_body
[
0
].
pdu_length
=
TBS_bytes
;
tx_req
.
tx_request_body
[
0
].
pdu_index
=
0
;
tx_req
.
tx_request_body
[
0
].
pdu
=
ulsch_input_buffer
;
ul_config_list
->
pdu_type
=
FAPI_NR_UL_CONFIG_TYPE_PUSCH
;
ul_config
->
number_pdus
++
;
// scheduled_response
...
...
@@ -1096,7 +1098,8 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
module_idP
);
fapi_nr_ul_config_request_t
*
ul_config
=
get_ul_config_request
(
mac
,
slotP
);
//fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP);
fapi_nr_ul_config_request_t
*
ul_config
=
&
mac
->
ul_config_request
[
0
];
fapi_nr_ul_config_prach_pdu
*
prach_config_pdu
;
fapi_nr_config_request_t
*
cfg
=
&
mac
->
phy_config
.
config_req
;
fapi_nr_prach_config_t
*
prach_config
=
&
cfg
->
prach_config
;
...
...
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
View file @
c0d123b9
...
...
@@ -77,7 +77,7 @@ void nr_config_Msg3_pdu(NR_UE_MAC_INST_t *mac,
uint8_t
nb_dmrs_re_per_rb
;
uint16_t
number_dmrs_symbols
=
0
;
int
N_PRB_oh
;
fapi_nr_ul_config_request_t
*
ul_config
=
&
mac
->
ul_config_request
;
fapi_nr_ul_config_request_t
*
ul_config
=
&
mac
->
ul_config_request
[
0
]
;
nfapi_nr_ue_pusch_pdu_t
*
pusch_config_pdu
=
&
ul_config
->
ul_config_list
[
ul_config
->
number_pdus
].
pusch_config_pdu
;
NR_ServingCellConfigCommon_t
*
scc
=
mac
->
scc
;
NR_BWP_Uplink_t
*
ubwp
=
mac
->
ULbwp
[
0
];
...
...
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