Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Shweta Shrivastava
openairinterface5G
Commits
5fc3a991
Commit
5fc3a991
authored
Jul 08, 2020
by
Francesco Mani
Browse files
dci size for 0_1 and some other modifications
parent
64e9629b
Changes
10
Hide whitespace changes
Inline
Side-by-side
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
View file @
5fc3a991
...
...
@@ -251,9 +251,8 @@ typedef struct {
uint8_t
short_messages
;
//8 bits
uint8_t
tb_scaling
;
//2 bits
uint8_t
pucch_resource_indicator
;
//3 bits
uint8_t
dmrs_sequence_initialization
;
//1 bit
uint8_t
system_info_indicator
;
//1 bit
uint8_t
ulsch_indicator
;
uint8_t
slot_format_indicator_count
;
uint8_t
*
slot_format_indicators
;
...
...
@@ -290,6 +289,7 @@ typedef struct {
dci_field_t
cloded_loop_indicator
;
//variable
dci_field_t
ul_sul_indicator
;
//variable
dci_field_t
antenna_ports
;
//variable
dci_field_t
dmrs_sequence_initialization
;
dci_field_t
reserved
;
//1_0/C-RNTI:10 bits, 1_0/P-RNTI: 6 bits, 1_0/SI-&RA-RNTI: 16 bits
}
dci_pdu_rel15_t
;
...
...
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
View file @
5fc3a991
...
...
@@ -31,6 +31,7 @@
*/
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
#include <limits.h>
const
uint8_t
nr_slots_per_frame
[
5
]
=
{
10
,
20
,
40
,
80
,
160
};
...
...
@@ -1879,7 +1880,8 @@ uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) {
return
1
;
}
uint16_t
nr_dci_size
(
NR_CellGroupConfig_t
*
secondaryCellGroup
,
uint16_t
nr_dci_size
(
NR_ServingCellConfigCommon_t
*
scc
,
NR_CellGroupConfig_t
*
secondaryCellGroup
,
dci_pdu_rel15_t
*
dci_pdu
,
nr_dci_format_t
format
,
nr_rnti_type_t
rnti_type
,
...
...
@@ -1887,9 +1889,15 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
int
bwp_id
)
{
uint16_t
size
=
0
;
uint16_t
numRBG
=
0
;
long
rbg_size_config
;
int
num_entries
=
0
;
int
pusch_antenna_ports
=
1
;
// TODO hardcoded number of antenna ports for pusch
NR_BWP_Downlink_t
*
bwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
array
[
bwp_id
-
1
];
NR_BWP_Uplink_t
*
ubwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
array
[
bwp_id
-
1
];
NR_PDSCH_Config_t
*
pdsch_config
=
bwp
->
bwp_Dedicated
->
pdsch_Config
->
choice
.
setup
;
NR_PUSCH_Config_t
*
pusch_Config
=
ubwp
->
bwp_Dedicated
->
pusch_Config
->
choice
.
setup
;
NR_SRS_Config_t
*
srs_config
=
ubwp
->
bwp_Dedicated
->
srs_Config
->
choice
.
setup
;
switch
(
format
)
{
/*Only sizes for 0_0 and 1_0 are correct at the moment*/
...
...
@@ -1897,30 +1905,197 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
/// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20
size
+=
20
;
size
+=
(
uint8_t
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
);
// Freq domain assignment -- hopping scenario to be updated
size
+=
nr_dci_size
(
secondaryCellGroup
,
dci_pdu
,
NR_DL_DCI_FORMAT_1_0
,
rnti_type
,
N_RB
,
bwp_id
)
-
size
;
// Padding to match 1_0 size
size
+=
nr_dci_size
(
scc
,
secondaryCellGroup
,
dci_pdu
,
NR_DL_DCI_FORMAT_1_0
,
rnti_type
,
N_RB
,
bwp_id
)
-
size
;
// Padding to match 1_0 size
// UL/SUL indicator assumed to be 0
break
;
case
NR_UL_DCI_FORMAT_0_1
:
/// fixed: Format identifier 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2,
SRS request 2
--1
7
size
+=
1
7
;
/// fixed: Format identifier 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2,
ULSCH indicator 1
--1
6
size
+=
1
6
;
// Carrier indicator
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
crossCarrierSchedulingConfig
!=
NULL
)
{
dci_pdu
->
carrier_indicator
.
nbits
=
3
;
size
+=
dci_pdu
->
carrier_indicator
.
nbits
;
}
// UL/SUL indicator
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
supplementaryUplink
!=
NULL
)
{
dci_pdu
->
carrier_indicator
.
nbits
=
1
;
size
+=
dci_pdu
->
ul_sul_indicator
.
nbits
;
}
// BWP Indicator
uint8_t
n_ul_bwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
count
;
if
(
n_ul_bwp
<
2
)
dci_pdu
->
bwp_indicator
.
nbits
=
n_ul_bwp
;
else
dci_pdu
->
bwp_indicator
.
nbits
=
2
;
size
+=
dci_pdu
->
bwp_indicator
.
nbits
;
// Freq domain assignment
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
initialUplinkBWP
->
pusch_Config
->
choice
.
setup
->
rbg_Size
!=
NULL
)
rbg_size_config
=
1
;
else
rbg_size_config
=
0
;
numRBG
=
getNRBG
(
NRRIV2BW
(
ubwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
NRRIV2PRBOFFSET
(
ubwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
rbg_size_config
);
if
(
pusch_Config
->
resourceAllocation
==
0
)
dci_pdu
->
frequency_domain_assignment
.
nbits
=
numRBG
;
else
if
(
pusch_Config
->
resourceAllocation
==
1
)
dci_pdu
->
frequency_domain_assignment
.
nbits
=
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
);
else
dci_pdu
->
frequency_domain_assignment
.
nbits
=
((
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
)
>
numRBG
)
?
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
)
+
1
:
numRBG
+
1
;
size
+=
dci_pdu
->
frequency_domain_assignment
.
nbits
;
// Time domain assignment
// VRB to PRB mapping
if
(
pusch_Config
->
pusch_TimeDomainAllocationList
==
NULL
)
{
if
(
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
==
NULL
)
num_entries
=
16
;
// num of entries in default table
else
num_entries
=
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
count
;
}
else
num_entries
=
pusch_Config
->
pusch_TimeDomainAllocationList
->
choice
.
setup
->
list
.
count
;
dci_pdu
->
time_domain_assignment
.
nbits
=
(
int
)
ceil
(
log2
(
num_entries
));
size
+=
dci_pdu
->
time_domain_assignment
.
nbits
;
// Frequency Hopping flag
if
((
pusch_Config
->
frequencyHopping
!=
NULL
)
&&
(
pusch_Config
->
resourceAllocation
!=
NR_PUSCH_Config__resourceAllocation_resourceAllocationType0
))
{
dci_pdu
->
frequency_hopping_flag
.
nbits
=
1
;
size
+=
1
;
}
// 1st DAI
if
(
secondaryCellGroup
->
physicalCellGroupConfig
->
pdsch_HARQ_ACK_Codebook
==
NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic
)
dci_pdu
->
dai
[
0
].
nbits
=
2
;
else
dci_pdu
->
dai
[
0
].
nbits
=
1
;
size
+=
dci_pdu
->
dai
[
0
].
nbits
;
// 2nd DAI
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
pdsch_ServingCellConfig
->
choice
.
setup
->
codeBlockGroupTransmission
!=
NULL
)
{
//TODO not sure about that
dci_pdu
->
dai
[
1
].
nbits
=
2
;
size
+=
dci_pdu
->
dai
[
1
].
nbits
;
}
// SRS resource indicator
if
(
pusch_Config
->
txConfig
!=
NULL
){
int
count
=
0
;
if
(
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_codebook
){
for
(
int
i
=
0
;
i
<
srs_config
->
srs_ResourceSetToAddModList
->
list
.
count
;
i
++
)
{
if
(
srs_config
->
srs_ResourceSetToAddModList
->
list
.
array
[
i
]
->
usage
==
NR_SRS_ResourceSet__usage_codebook
)
count
++
;
}
if
(
count
>
1
)
dci_pdu
->
srs_resource_indicator
.
nbits
=
1
;
}
else
{
int
lmin
,
Lmax
=
0
;
int
lsum
=
0
;
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
!=
NULL
)
{
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
ext1
->
maxMIMO_Layers
!=
NULL
)
Lmax
=
*
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
ext1
->
maxMIMO_Layers
;
else
AssertFatal
(
1
==
0
,
"MIMO on PUSCH not supported, maxMIMO_Layers needs to be set to 1
\n
"
);
}
else
AssertFatal
(
1
==
0
,
"MIMO on PUSCH not supported, maxMIMO_Layers needs to be set to 1
\n
"
);
for
(
int
i
=
0
;
i
<
srs_config
->
srs_ResourceSetToAddModList
->
list
.
count
;
i
++
)
{
if
(
srs_config
->
srs_ResourceSetToAddModList
->
list
.
array
[
i
]
->
usage
==
NR_SRS_ResourceSet__usage_nonCodebook
)
count
++
;
if
(
count
<
Lmax
)
lmin
=
count
;
else
lmin
=
Lmax
;
for
(
int
k
=
1
;
k
<=
lmin
;
k
++
)
{
lsum
+=
binomial
(
count
,
k
);
}
}
dci_pdu
->
srs_resource_indicator
.
nbits
=
(
int
)
ceil
(
log2
(
lsum
));
}
}
size
+=
dci_pdu
->
srs_resource_indicator
.
nbits
;
// Precoding info and number of layers
long
transformPrecoder
;
if
(
pusch_Config
->
transformPrecoder
==
NULL
){
// if transform precoder is null, apply the values from msg3
if
(
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
rach_ConfigCommon
->
choice
.
setup
->
msg3_transformPrecoder
==
NULL
)
transformPrecoder
=
1
;
else
transformPrecoder
=
0
;
}
else
transformPrecoder
=
*
pusch_Config
->
transformPrecoder
;
if
(
pusch_Config
->
txConfig
!=
NULL
){
if
(
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_codebook
){
if
(
pusch_antenna_ports
>
1
)
{
if
(
pusch_antenna_ports
==
4
)
{
if
((
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_disabled
)
&&
(
*
pusch_Config
->
maxRank
>
1
))
dci_pdu
->
precoding_information
.
nbits
=
6
-
(
*
pusch_Config
->
codebookSubset
);
else
{
if
(
*
pusch_Config
->
codebookSubset
==
NR_PUSCH_Config__codebookSubset_nonCoherent
)
dci_pdu
->
precoding_information
.
nbits
=
2
;
else
dci_pdu
->
precoding_information
.
nbits
=
5
-
(
*
pusch_Config
->
codebookSubset
);
}
}
else
{
AssertFatal
(
pusch_antenna_ports
==
2
,
"Not valid number of antenna ports"
);
if
((
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_disabled
)
&&
(
*
pusch_Config
->
maxRank
==
2
))
dci_pdu
->
precoding_information
.
nbits
=
4
-
(
*
pusch_Config
->
codebookSubset
);
else
dci_pdu
->
precoding_information
.
nbits
=
3
-
(
*
pusch_Config
->
codebookSubset
);
}
}
}
}
size
+=
dci_pdu
->
precoding_information
.
nbits
;
// Antenna ports
NR_DMRS_UplinkConfig_t
*
NR_DMRS_UplinkConfig
=
NULL
;
int
xa
=
0
;
int
xb
=
0
;
if
(
pusch_Config
->
dmrs_UplinkForPUSCH_MappingTypeA
!=
NULL
){
NR_DMRS_UplinkConfig
=
pusch_Config
->
dmrs_UplinkForPUSCH_MappingTypeA
->
choice
.
setup
;
xa
=
ul_ant_bits
(
NR_DMRS_UplinkConfig
,
transformPrecoder
);
}
if
(
pusch_Config
->
dmrs_UplinkForPUSCH_MappingTypeB
!=
NULL
){
NR_DMRS_UplinkConfig
=
pusch_Config
->
dmrs_UplinkForPUSCH_MappingTypeB
->
choice
.
setup
;
xb
=
ul_ant_bits
(
NR_DMRS_UplinkConfig
,
transformPrecoder
);
}
if
(
xa
>
xb
)
dci_pdu
->
antenna_ports
.
nbits
=
xa
;
else
dci_pdu
->
antenna_ports
.
nbits
=
xb
;
size
+=
dci_pdu
->
antenna_ports
.
nbits
;
// SRS request
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
supplementaryUplink
==
NULL
)
dci_pdu
->
srs_request
.
nbits
=
2
;
else
dci_pdu
->
srs_request
.
nbits
=
3
;
size
+=
dci_pdu
->
srs_request
.
nbits
;
// CSI request
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
csi_MeasConfig
!=
NULL
)
{
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
csi_MeasConfig
->
choice
.
setup
->
reportTriggerSize
!=
NULL
)
{
dci_pdu
->
csi_request
.
nbits
=
*
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
csi_MeasConfig
->
choice
.
setup
->
reportTriggerSize
;
size
+=
dci_pdu
->
csi_request
.
nbits
;
}
}
// CBGTI
if
(
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
codeBlockGroupTransmission
!=
NULL
)
{
int
num
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
->
codeBlockGroupTransmission
->
choice
.
setup
->
maxCodeBlockGroupsPerTransportBlock
;
dci_pdu
->
cbgti
.
nbits
=
2
+
(
num
<<
1
);
size
+=
dci_pdu
->
cbgti
.
nbits
;
}
// PTRS - DMRS association
if
(
(
NR_DMRS_UplinkConfig
->
phaseTrackingRS
==
NULL
&&
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_disabled
)
||
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_enabled
||
(
*
pusch_Config
->
maxRank
==
1
)
)
dci_pdu
->
ptrs_dmrs_association
.
nbits
=
0
;
else
dci_pdu
->
ptrs_dmrs_association
.
nbits
=
2
;
size
+=
dci_pdu
->
ptrs_dmrs_association
.
nbits
;
// beta offset indicator
if
(
pusch_Config
->
uci_OnPUSCH
!=
NULL
){
if
(
pusch_Config
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
->
present
==
NR_UCI_OnPUSCH__betaOffsets_PR_dynamic
)
{
dci_pdu
->
beta_offset_indicator
.
nbits
=
2
;
size
+=
dci_pdu
->
beta_offset_indicator
.
nbits
;
}
}
// DMRS sequence init
if
(
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_disabled
)
{
dci_pdu
->
dmrs_sequence_initialization
.
nbits
=
1
;
size
+=
dci_pdu
->
dmrs_sequence_initialization
.
nbits
;
}
break
;
case
NR_DL_DCI_FORMAT_1_0
:
...
...
@@ -1946,10 +2121,10 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
dci_pdu
->
bwp_indicator
.
nbits
=
2
;
size
+=
dci_pdu
->
bwp_indicator
.
nbits
;
// Freq domain assignment
long
rbg_size_config
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
initialDownlinkBWP
->
pdsch_Config
->
choice
.
setup
->
rbg_Size
;
uint16_t
numRBG
=
getNRBG
(
NRRIV2BW
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
NRRIV2PRBOFFSET
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
rbg_size_config
);
rbg_size_config
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
initialDownlinkBWP
->
pdsch_Config
->
choice
.
setup
->
rbg_Size
;
numRBG
=
getNRBG
(
NRRIV2BW
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
NRRIV2PRBOFFSET
(
bwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
),
rbg_size_config
);
if
(
pdsch_config
->
resourceAllocation
==
0
)
dci_pdu
->
frequency_domain_assignment
.
nbits
=
numRBG
;
else
if
(
pdsch_config
->
resourceAllocation
==
1
)
...
...
@@ -1958,7 +2133,6 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
dci_pdu
->
frequency_domain_assignment
.
nbits
=
((
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
)
>
numRBG
)
?
(
int
)
ceil
(
log2
(
(
N_RB
*
(
N_RB
+
1
))
>>
1
)
)
+
1
:
numRBG
+
1
;
size
+=
dci_pdu
->
frequency_domain_assignment
.
nbits
;
// Time domain assignment (see table 5.1.2.1.1-1 in 38.214
int
num_entries
;
if
(
pdsch_config
->
pdsch_TimeDomainAllocationList
==
NULL
)
{
if
(
bwp
->
bwp_Common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
==
NULL
)
num_entries
=
16
;
// num of entries in default table
...
...
@@ -2068,6 +2242,27 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
return
size
;
}
int
ul_ant_bits
(
NR_DMRS_UplinkConfig_t
*
NR_DMRS_UplinkConfig
,
long
transformPrecoder
)
{
uint8_t
type
,
maxl
;
if
(
NR_DMRS_UplinkConfig
->
dmrs_Type
==
NULL
)
type
=
1
;
else
type
=
2
;
if
(
NR_DMRS_UplinkConfig
->
maxLength
==
NULL
)
maxl
=
1
;
else
maxl
=
2
;
if
(
transformPrecoder
==
NR_PUSCH_Config__transformPrecoder_disabled
)
return
(
maxl
+
type
+
1
);
else
{
if
(
type
==
1
)
return
(
maxl
<<
1
);
else
AssertFatal
(
1
==
0
,
"DMRS type not valid for this choice"
);
}
}
int
tdd_period_to_num
[
8
]
=
{
500
,
625
,
1000
,
1250
,
2000
,
2500
,
5000
,
10000
};
int
is_nr_DL_slot
(
NR_ServingCellConfigCommon_t
*
scc
,
slot_t
slot
)
{
...
...
@@ -2208,3 +2403,20 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i
AssertFatal
(
1
==
0
,
"Shouldn't get here
\n
"
);
return
(
-
1
);
}
int
binomial
(
int
n
,
int
k
)
{
int
c
=
1
,
i
;
if
(
k
>
n
-
k
)
k
=
n
-
k
;
for
(
i
=
1
;
i
<=
k
;
i
++
,
n
--
)
{
if
(
c
/
i
>
UINT_MAX
/
n
)
// return 0 on overflow
return
0
;
c
=
c
/
i
*
n
+
c
%
i
*
n
/
i
;
}
return
c
;
}
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
View file @
5fc3a991
...
...
@@ -77,7 +77,8 @@ int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slotP);
int
is_nr_UL_slot
(
NR_ServingCellConfigCommon_t
*
scc
,
slot_t
slotP
);
uint16_t
nr_dci_size
(
NR_CellGroupConfig_t
*
secondaryCellGroup
,
uint16_t
nr_dci_size
(
NR_ServingCellConfigCommon_t
*
scc
,
NR_CellGroupConfig_t
*
secondaryCellGroup
,
dci_pdu_rel15_t
*
dci_pdu
,
nr_dci_format_t
format
,
nr_rnti_type_t
rnti_type
,
...
...
@@ -103,6 +104,8 @@ uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
uint8_t
nb_preambles
,
uint8_t
unpaired
);
int
ul_ant_bits
(
NR_DMRS_UplinkConfig_t
*
NR_DMRS_UplinkConfig
,
long
transformPrecoder
);
int
get_format0
(
uint8_t
index
,
uint8_t
unpaired
);
uint16_t
get_NCS
(
uint8_t
index
,
uint16_t
format
,
uint8_t
restricted_set_config
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
View file @
5fc3a991
...
...
@@ -223,7 +223,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
rel15
->
BWPSize
=
NRRIV2BW
(
initialDownlinkBWP
->
genericParameters
.
locationAndBandwidth
,
275
);
rel15
->
BWPStart
=
NRRIV2PRBOFFSET
(
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
// NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
rel15
->
SubcarrierSpacing
=
initialDownlinkBWP
->
genericParameters
.
subcarrierSpacing
;
rel15
->
dci_length
=
nr_dci_size
(
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format
,
NR_RNTI_C
,
rel15
->
BWPSize
,
bwp_id
);
rel15
->
dci_length
=
nr_dci_size
(
scc
,
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format
,
NR_RNTI_C
,
rel15
->
BWPSize
,
bwp_id
);
for
(
int
i
=
0
;
i
<
sps
;
i
++
)
if
((
monitoringSymbolsWithinSlot
>>
(
sps
-
1
-
i
))
&
1
)
{
rel15
->
coreset
.
StartSymbolIndex
=
i
;
...
...
@@ -243,7 +243,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
rel15
->
BWPSize
=
NRRIV2BW
(
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
rel15
->
BWPStart
=
NRRIV2PRBOFFSET
(
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
);
rel15
->
SubcarrierSpacing
=
bwp_Common
->
genericParameters
.
subcarrierSpacing
;
rel15
->
dci_length
=
nr_dci_size
(
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format
,
NR_RNTI_C
,
rel15
->
BWPSize
,
bwp_id
);
rel15
->
dci_length
=
nr_dci_size
(
scc
,
mac
->
scg
,
def_dci_pdu_rel15
,
rel15
->
dci_format
,
NR_RNTI_C
,
rel15
->
BWPSize
,
bwp_id
);
// get UE-specific search space
for
(
ss_id
=
0
;
ss_id
<
FAPI_NR_MAX_SS_PER_CORESET
&&
mac
->
SSpace
[
0
][
0
][
ss_id
]
!=
NULL
;
ss_id
++
){
uss
=
mac
->
SSpace
[
0
][
0
][
ss_id
];
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
5fc3a991
...
...
@@ -3530,7 +3530,7 @@ void nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
dci_pdu_rel15
->
cbgfi
.
val
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
((
1
<<
dci_pdu_rel15
->
cbgfi
.
nbits
)
-
1
);
// DMRS sequence init
pos
+=
1
;
dci_pdu_rel15
->
dmrs_sequence_initialization
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0x1
;
dci_pdu_rel15
->
dmrs_sequence_initialization
.
val
=
(
*
dci_pdu
>>
(
dci_size
-
pos
))
&
0x1
;
break
;
}
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
5fc3a991
...
...
@@ -688,7 +688,7 @@ void nr_generate_Msg2(module_id_t module_idP,
pdcch_pdu_rel15
->
StartSymbolIndex
,
pdcch_pdu_rel15
->
DurationSymbols
);
fill_dci_pdu_rel15
(
secondaryCellGroup
,
pdcch_pdu_rel15
,
&
dci_pdu_rel15
[
0
],
dci_formats
,
rnti_types
,
dci10_bw
,
ra
->
bwp_id
);
fill_dci_pdu_rel15
(
scc
,
secondaryCellGroup
,
pdcch_pdu_rel15
,
&
dci_pdu_rel15
[
0
],
dci_formats
,
rnti_types
,
dci10_bw
,
ra
->
bwp_id
);
dl_req
->
nPDUs
+=
2
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
5fc3a991
...
...
@@ -329,7 +329,7 @@ int configure_fapi_dl_pdu(int Mod_idP,
pdsch_pdu_rel15
->
rbStart
=
(
rbStart
!=
NULL
)
?
*
rbStart
:
0
;
pdsch_pdu_rel15
->
rbSize
=
(
rbSize
!=
NULL
)
?
*
rbSize
:
pdsch_pdu_rel15
->
BWPSize
;
pdsch_pdu_rel15
->
VRBtoPRBMapping
=
1
;
// non-interleaved, check if this is ok for initialBWP
// choose shortest PDSCH
int
startSymbolAndLength
=
0
;
int
time_domain_assignment
=
2
;
int
StartSymbolIndex
,
NrOfSymbols
;
...
...
@@ -362,10 +362,10 @@ int configure_fapi_dl_pdu(int Mod_idP,
AssertFatal
(
1
==
0
,
"Only frequency resource allocation type 1 is currently supported
\n
"
);
// time domain assignment
dci_pdu_rel15
[
0
].
time_domain_assignment
.
val
=
time_domain_assignment
;
// row index used here instead of SLIV;
// mcs
ndi
and rv
// mcs and rv
dci_pdu_rel15
[
0
].
mcs
=
pdsch_pdu_rel15
->
mcsIndex
[
0
];
dci_pdu_rel15
[
0
].
rv
=
pdsch_pdu_rel15
->
rvIndex
[
0
];
// harq pid
// harq pid
and ndi
dci_pdu_rel15
[
0
].
harq_pid
=
current_harq_pid
;
dci_pdu_rel15
[
0
].
ndi
=
UE_list
->
UE_sched_ctrl
[
UE_id
].
harq_processes
[
current_harq_pid
].
ndi
;
// DAI
...
...
@@ -381,7 +381,8 @@ int configure_fapi_dl_pdu(int Mod_idP,
UE_list
->
UE_sched_ctrl
[
UE_id
].
harq_processes
[
current_harq_pid
].
is_waiting
=
1
;
// antenna ports
dci_pdu_rel15
[
0
].
antenna_ports
.
val
=
0
;
// nb of cdm groups w/o data 1 and dmrs port 0
// dmrs sequence initialization
dci_pdu_rel15
[
0
].
dmrs_sequence_initialization
.
val
=
pdsch_pdu_rel15
->
SCID
;
LOG_D
(
MAC
,
"[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d
\n
"
,
dci_pdu_rel15
[
0
].
frequency_domain_assignment
.
val
,
pdsch_pdu_rel15
->
rbStart
,
...
...
@@ -436,7 +437,7 @@ int configure_fapi_dl_pdu(int Mod_idP,
rnti_types
[
0
]
=
NR_RNTI_C
;
fill_dci_pdu_rel15
(
secondaryCellGroup
,
pdcch_pdu_rel15
,
dci_pdu_rel15
,
dci_formats
,
rnti_types
,
pdsch_pdu_rel15
->
BWPSize
,
bwp_id
);
fill_dci_pdu_rel15
(
scc
,
secondaryCellGroup
,
pdcch_pdu_rel15
,
dci_pdu_rel15
,
dci_formats
,
rnti_types
,
pdsch_pdu_rel15
->
BWPSize
,
bwp_id
);
LOG_D
(
MAC
,
"DCI params: rnti %x, rnti_type %d, dci_format %d
\n
\
coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d
\n
"
,
...
...
@@ -466,22 +467,69 @@ int configure_fapi_dl_pdu(int Mod_idP,
return
TBS
;
//Return TBS in bytes
}
void
config_uldci
(
NR_BWP_Uplink_t
*
ubwp
,
nfapi_nr_pusch_pdu_t
*
pusch_pdu
,
nfapi_nr_dl_tti_pdcch_pdu_rel15_t
*
pdcch_pdu_rel15
,
dci_pdu_rel15_t
*
dci_pdu_rel15
,
int
*
dci_formats
,
int
*
rnti_types
)
{
dci_pdu_rel15
->
frequency_domain_assignment
.
val
=
PRBalloc_to_locationandbandwidth0
(
pusch_pdu
->
rb_size
,
pusch_pdu
->
rb_start
,
NRRIV2BW
(
ubwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
));
void
config_uldci
(
NR_BWP_Uplink_t
*
ubwp
,
nfapi_nr_pusch_pdu_t
*
pusch_pdu
,
nfapi_nr_dl_tti_pdcch_pdu_rel15_t
*
pdcch_pdu_rel15
,
dci_pdu_rel15_t
*
dci_pdu_rel15
,
int
*
dci_formats
,
int
*
rnti_types
,
int
n_ubwp
,
int
bwp_id
)
{
switch
(
dci_formats
[(
pdcch_pdu_rel15
->
numDlDci
)
-
1
])
{
case
NR_UL_DCI_FORMAT_0_0
:
dci_pdu_rel15
->
frequency_domain_assignment
.
val
=
PRBalloc_to_locationandbandwidth0
(
pusch_pdu
->
rb_size
,
pusch_pdu
->
rb_start
,
NRRIV2BW
(
ubwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
));
dci_pdu_rel15
->
time_domain_assignment
.
val
=
2
;
// row index used here instead of SLIV;
dci_pdu_rel15
->
frequency_hopping_flag
.
val
=
pusch_pdu
->
frequency_hopping
;
dci_pdu_rel15
->
mcs
=
9
;
dci_pdu_rel15
->
format_indicator
=
0
;
dci_pdu_rel15
->
ndi
=
1
;
dci_pdu_rel15
->
rv
=
0
;
dci_pdu_rel15
->
harq_pid
=
0
;
dci_pdu_rel15
->
tpc
=
2
;
break
;
case
NR_UL_DCI_FORMAT_0_1
:
dci_pdu_rel15
->
ndi
=
pusch_pdu
->
pusch_data
.
new_data_indicator
;
dci_pdu_rel15
->
rv
=
pusch_pdu
->
pusch_data
.
rv_index
;
dci_pdu_rel15
->
harq_pid
=
pusch_pdu
->
pusch_data
.
harq_process_id
;
dci_pdu_rel15
->
frequency_hopping_flag
.
val
=
pusch_pdu
->
frequency_hopping
;
//dci_pdu_rel15->dai[0].val = ???; //TODO
// bwp indicator
if
(
n_ubwp
<
4
)
dci_pdu_rel15
->
bwp_indicator
.
val
=
bwp_id
;
else
dci_pdu_rel15
->
bwp_indicator
.
val
=
bwp_id
-
1
;
// as per table 7.3.1.1.2-1 in 38.212
// frequency domain assignment
if
(
ubwp
->
bwp_Dedicated
->
pusch_Config
->
choice
.
setup
->
resourceAllocation
==
NR_PUSCH_Config__resourceAllocation_resourceAllocationType1
)
dci_pdu_rel15
->
frequency_domain_assignment
.
val
=
PRBalloc_to_locationandbandwidth0
(
pusch_pdu
->
rb_size
,
pusch_pdu
->
rb_start
,
NRRIV2BW
(
ubwp
->
bwp_Common
->
genericParameters
.
locationAndBandwidth
,
275
));
else
AssertFatal
(
1
==
0
,
"Only frequency resource allocation type 1 is currently supported
\n
"
);
// time domain assignment
dci_pdu_rel15
->
time_domain_assignment
.
val
=
2
;
// mcs
dci_pdu_rel15
->
mcs
=
pusch_pdu
->
mcs_index
;
// tpc command for pusch
dci_pdu_rel15
->
tpc
=
2
;
//TODO
// SRS resource indicator
if
(
ubwp
->
bwp_Dedicated
->
pusch_Config
->
choice
.
setup
->
txConfig
!=
NULL
)
{
if
(
*
ubwp
->
bwp_Dedicated
->
pusch_Config
->
choice
.
setup
->
txConfig
==
NR_PUSCH_Config__txConfig_codebook
)
dci_pdu_rel15
->
srs_resource_indicator
.
val
=
0
;
// taking resource 0 for SRS
else
AssertFatal
(
1
==
0
,
"Non Codebook configuration non supported
\n
"
);
}
// Antenna Ports
dci_pdu_rel15
->
antenna_ports
.
val
=
0
;
// TODO for now it is hardcoded, it should depends on cdm group no data and rank
// DMRS sequence initialization
dci_pdu_rel15
->
dmrs_sequence_initialization
.
val
=
pusch_pdu
->
scid
;
break
;
default
:
AssertFatal
(
1
==
0
,
"Valid UL formats are 0_0 and 0_1
\n
"
);
}
dci_pdu_rel15
->
time_domain_assignment
.
val
=
2
;
// row index used here instead of SLIV;
dci_pdu_rel15
->
frequency_hopping_flag
.
val
=
0
;
dci_pdu_rel15
->
mcs
=
9
;
dci_pdu_rel15
->
format_indicator
=
0
;
dci_pdu_rel15
->
ndi
=
1
;
dci_pdu_rel15
->
rv
=
0
;
dci_pdu_rel15
->
harq_pid
=
0
;
dci_pdu_rel15
->
tpc
=
2
;
LOG_D
(
MAC
,
"[gNB scheduler phytest] ULDCI type 0 payload: PDCCH CCEIndex %d, freq_alloc %d, time_alloc %d, freq_hop_flag %d, mcs %d tpc %d ndi %d rv %d
\n
"
,
pdcch_pdu_rel15
->
dci_pdu
.
CceIndex
[
pdcch_pdu_rel15
->
numDlDci
],
dci_pdu_rel15
->
frequency_domain_assignment
.
val
,
...
...
@@ -491,10 +539,6 @@ void config_uldci(NR_BWP_Uplink_t *ubwp,nfapi_nr_pusch_pdu_t *pusch_pdu,nfapi_nr
dci_pdu_rel15
->
tpc
,
dci_pdu_rel15
->
ndi
,
dci_pdu_rel15
->
rv
);
dci_formats
[
pdcch_pdu_rel15
->
numDlDci
]
=
NR_UL_DCI_FORMAT_0_0
;
rnti_types
[
pdcch_pdu_rel15
->
numDlDci
]
=
NR_RNTI_C
;
pdcch_pdu_rel15
->
numDlDci
++
;
}
...
...
@@ -736,7 +780,7 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
NR_ServingCellConfigCommon_t
*
scc
=
cc
->
ServingCellConfigCommon
;
int
bwp_id
=
1
;
int
mu
=
scc
->
uplinkConfigCommon
->
initialUplinkBWP
->
genericParameters
.
subcarrierSpacing
;
int
UE_id
=
0
;
NR_UE_list_t
*
UE_list
=
&
RC
.
nrmac
[
Mod_idP
]
->
UE_list
;
AssertFatal
(
UE_list
->
active
[
UE_id
]
>=
0
,
"Cannot find UE_id %d is not active
\n
"
,
UE_id
);
...
...
@@ -746,7 +790,9 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
"downlinkBWP_ToAddModList has %d BWP!
\n
"
,
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
count
);
NR_BWP_Uplink_t
*
ubwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
array
[
bwp_id
-
1
];
int
n_ubwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
count
;
NR_BWP_Downlink_t
*
bwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
array
[
bwp_id
-
1
];
NR_PUSCH_Config_t
*
pusch_Config
=
ubwp
->
bwp_Dedicated
->
pusch_Config
->
choice
.
setup
;
nfapi_nr_ul_tti_request_t
*
UL_tti_req
=
&
RC
.
nrmac
[
Mod_idP
]
->
UL_tti_req
[
0
];
nfapi_nr_ul_dci_request_t
*
UL_dci_req
=
&
RC
.
nrmac
[
Mod_idP
]
->
UL_dci_req
[
0
];
...
...
@@ -767,20 +813,27 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
LOG_D
(
MAC
,
"Scheduling UE specific PUSCH
\n
"
);
//UL_tti_req = &nr_mac->UL_tti_req[CC_id];
/*
// original configuration
rel15_ul->rnti = 0x1234;
rel15_ul->ulsch_pdu_rel15.start_rb = 30;
rel15_ul->ulsch_pdu_rel15.number_rbs = 50;
rel15_ul->ulsch_pdu_rel15.start_symbol = 2;
rel15_ul->ulsch_pdu_rel15.number_symbols = 12;
rel15_ul->ulsch_pdu_rel15.nb_re_dmrs = 6;
rel15_ul->ulsch_pdu_rel15.length_dmrs = 1;
rel15_ul->ulsch_pdu_rel15.Qm = 2;
rel15_ul->ulsch_pdu_rel15.mcs = 9;
rel15_ul->ulsch_pdu_rel15.rv = 0;
rel15_ul->ulsch_pdu_rel15.n_layers = 1;
*/
//Resource Allocation in time domain
int
startSymbolAndLength
=
0
;
int
time_domain_assignment
=
1
;
int
StartSymbolIndex
,
NrOfSymbols
,
K2
,
mapping_type
;
AssertFatal
(
time_domain_assignment
<
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
count
,
"time_domain_assignment %d>=%d
\n
"
,
time_domain_assignment
,
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
count
);
startSymbolAndLength
=
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
array
[
time_domain_assignment
]
->
startSymbolAndLength
;
SLIV2SL
(
startSymbolAndLength
,
&
StartSymbolIndex
,
&
NrOfSymbols
);
pusch_pdu
->
start_symbol_index
=
StartSymbolIndex
;
pusch_pdu
->
nr_of_symbols
=
NrOfSymbols
;
mapping_type
=
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
array
[
time_domain_assignment
]
->
mappingType
;
if
(
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
array
[
time_domain_assignment
]
->
k2
!=
NULL
)
K2
=
*
ubwp
->
bwp_Common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
->
list
.
array
[
time_domain_assignment
]
->
k2
;
else
{
if
(
mu
<
2
)
K2
=
1
;
else
if
(
mu
==
2
)
K2
=
2
;
else
K2
=
3
;
}
<