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
Michael Black
OpenXG UE
Commits
bfa6e160
Commit
bfa6e160
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
3e2da872
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 @
bfa6e160
...
...
@@ -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 @
bfa6e160
...
...
@@ -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 @
bfa6e160
...
...
@@ -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 @
bfa6e160
...
...
@@ -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 @
bfa6e160
...
...
@@ -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