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
spbro
OpenXG-RAN
Commits
ca60a69f
Commit
ca60a69f
authored
May 17, 2021
by
hardy
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_multiplexing_HARQ_CSI_PUCCH' into integration_2021_wk20_a
parents
568af888
e1523126
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
81 additions
and
69 deletions
+81
-69
openair1/PHY/NR_TRANSPORT/pucch_rx.c
openair1/PHY/NR_TRANSPORT/pucch_rx.c
+2
-2
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+8
-6
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+8
-6
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+6
-5
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+47
-44
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+4
-4
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+3
-0
openair2/RRC/NR/rrc_gNB_reconfig.c
openair2/RRC/NR/rrc_gNB_reconfig.c
+3
-2
No files found.
openair1/PHY/NR_TRANSPORT/pucch_rx.c
View file @
ca60a69f
...
...
@@ -1621,7 +1621,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
if
(
pucch_pdu
->
bit_len_harq
>
0
)
{
int
harq_bytes
=
pucch_pdu
->
bit_len_harq
>>
3
;
if
((
pucch_pdu
->
bit_len_harq
&
7
)
>
0
)
harq_bytes
++
;
uci_pdu
->
pduBitmap
|=
1
;
uci_pdu
->
pduBitmap
|=
2
;
uci_pdu
->
harq
.
harq_payload
=
(
uint8_t
*
)
malloc
(
harq_bytes
);
uci_pdu
->
harq
.
harq_crc
=
decoderState
;
int
i
=
0
;
...
...
@@ -1635,7 +1635,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
}
if
(
pucch_pdu
->
sr_flag
==
1
)
{
uci_pdu
->
pduBitmap
|=
2
;
uci_pdu
->
pduBitmap
|=
1
;
uci_pdu
->
sr
.
sr_bit_len
=
1
;
uci_pdu
->
sr
.
sr_payload
=
malloc
(
1
);
uci_pdu
->
sr
.
sr_payload
[
0
]
=
decodedPayload
[
0
]
&
1
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
ca60a69f
...
...
@@ -1172,9 +1172,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
harq
->
is_waiting
=
true
;
ra
->
harq_pid
=
current_harq_pid
;
nr_acknack_scheduling
(
module_idP
,
UE_id
,
frameP
,
slotP
);
harq
->
feedback_slot
=
sched_ctrl
->
sched_pucch
->
ul_slot
;
harq
->
feedback_frame
=
sched_ctrl
->
sched_pucch
->
frame
;
int
alloc
=
nr_acknack_scheduling
(
module_idP
,
UE_id
,
frameP
,
slotP
);
AssertFatal
(
alloc
>=
0
,
"Couldn't find a pucch allocation for ack nack (msg4)
\n
"
);
NR_sched_pucch_t
*
pucch
=
&
sched_ctrl
->
sched_pucch
[
alloc
];
harq
->
feedback_slot
=
pucch
->
ul_slot
;
harq
->
feedback_frame
=
pucch
->
frame
;
// Bytes to be transmitted
uint8_t
*
buf
=
(
uint8_t
*
)
harq
->
tb
;
...
...
@@ -1376,10 +1378,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dci_payload
.
rv
=
pdsch_pdu_rel15
->
rvIndex
[
0
];
dci_payload
.
harq_pid
=
current_harq_pid
;
dci_payload
.
ndi
=
harq
->
ndi
;
dci_payload
.
dai
[
0
].
val
=
(
sched_ctrl
->
sched_
pucch
->
dai_c
-
1
)
&
3
;
dci_payload
.
dai
[
0
].
val
=
(
pucch
->
dai_c
-
1
)
&
3
;
dci_payload
.
tpc
=
sched_ctrl
->
tpc1
;
// TPC for PUCCH: table 7.2.1-1 in 38.213
dci_payload
.
pucch_resource_indicator
=
sched_ctrl
->
sched_
pucch
->
resource_indicator
;
dci_payload
.
pdsch_to_harq_feedback_timing_indicator
.
val
=
sched_ctrl
->
sched_
pucch
->
timing_indicator
;
dci_payload
.
pucch_resource_indicator
=
pucch
->
resource_indicator
;
dci_payload
.
pdsch_to_harq_feedback_timing_indicator
.
val
=
pucch
->
timing_indicator
;
LOG_D
(
NR_MAC
,
"[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d
\n
"
,
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
View file @
ca60a69f
...
...
@@ -492,8 +492,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */
const
bool
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
!
alloc
)
{
const
int
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
alloc
<
0
)
{
LOG_D
(
MAC
,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d
\n
"
,
__func__
,
...
...
@@ -509,6 +509,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
return
false
;
}
sched_ctrl
->
sched_pdsch
.
pucch_allocation
=
alloc
;
/* just reuse from previous scheduling opportunity, set new start RB */
sched_ctrl
->
sched_pdsch
=
*
retInfo
;
sched_ctrl
->
sched_pdsch
.
rbStart
=
rbStart
;
...
...
@@ -615,8 +617,8 @@ void pf_dl(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */
const
bool
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
!
alloc
)
{
const
int
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
alloc
<
0
)
{
LOG_D
(
MAC
,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d
\n
"
,
__func__
,
...
...
@@ -648,7 +650,7 @@ void pf_dl(module_id_t module_id,
scc
,
UE_info
->
secondaryCellGroup
[
UE_id
],
sched_ctrl
->
active_bwp
,
tda
,
num_dmrs_cdm_grps_no_data
,
ps
);
sched_pdsch
->
Qm
=
nr_get_Qm_dl
(
sched_pdsch
->
mcs
,
ps
->
mcsTableIdx
);
sched_pdsch
->
R
=
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
ps
->
mcsTableIdx
);
sched_pdsch
->
pucch_allocation
=
alloc
;
uint32_t
TBS
=
0
;
uint16_t
rbSize
;
const
int
oh
=
2
+
(
sched_ctrl
->
num_total_bytes
>=
256
)
...
...
@@ -811,7 +813,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
NR_UE_harq_t
*
harq
=
&
sched_ctrl
->
harq_processes
[
current_harq_pid
];
DevAssert
(
!
harq
->
is_waiting
);
add_tail_nr_list
(
&
sched_ctrl
->
feedback_dl_harq
,
current_harq_pid
);
NR_sched_pucch_t
*
pucch
=
&
sched_ctrl
->
sched_pucch
[
0
];
NR_sched_pucch_t
*
pucch
=
&
sched_ctrl
->
sched_pucch
[
sched_pdsch
->
pucch_allocation
];
harq
->
feedback_frame
=
pucch
->
frame
;
harq
->
feedback_slot
=
pucch
->
ul_slot
;
harq
->
is_waiting
=
true
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
ca60a69f
...
...
@@ -339,8 +339,8 @@ void nr_preprocessor_phytest(module_id_t module_id,
__func__
,
UE_id
);
const
bool
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
!
alloc
)
{
const
int
alloc
=
nr_acknack_scheduling
(
module_id
,
UE_id
,
frame
,
slot
);
if
(
alloc
<
0
)
{
LOG_D
(
MAC
,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d
\n
"
,
__func__
,
...
...
@@ -355,12 +355,13 @@ void nr_preprocessor_phytest(module_id_t module_id,
return
;
}
AssertFatal
(
alloc
,
"could not find uplink slot for PUCCH (RNTI %04x@%d.%d)!
\n
"
,
rnti
,
frame
,
slot
);
//
AssertFatal(alloc,
//
"could not find uplink slot for PUCCH (RNTI %04x@%d.%d)!\n",
//
rnti, frame, slot);
NR_sched_pdsch_t
*
sched_pdsch
=
&
sched_ctrl
->
sched_pdsch
;
NR_pdsch_semi_static_t
*
ps
=
&
sched_ctrl
->
pdsch_semi_static
;
sched_pdsch
->
pucch_allocation
=
alloc
;
sched_pdsch
->
rbStart
=
rbStart
;
sched_pdsch
->
rbSize
=
rbSize
;
const
int
tda
=
RC
.
nrmac
[
module_id
]
->
preferred_dl_tda
[
sched_ctrl
->
active_bwp
->
bwp_Id
][
slot
];
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
View file @
ca60a69f
...
...
@@ -553,9 +553,6 @@ void nr_csi_meas_reporting(int Mod_idP,
for
(
int
i
=
start
;
i
<
start
+
len
;
++
i
)
{
vrb_map_UL
[
i
]
|=
mask
;
}
AssertFatal
(
!
curr_pucch
->
simultaneous_harqcsi
,
"UE %04x has simultaneous HARQ/CSI configured, but we don't support that
\n
"
,
UE_info
->
rnti
[
UE_id
]);
}
}
}
...
...
@@ -1088,7 +1085,11 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
bool
nr_acknack_scheduling
(
int
mod_id
,
// this function returns an index to NR_sched_pucch structure
// currently this structure contains PUCCH0 at index 0 and PUCCH2 at index 1
// if the function returns -1 it was not possible to schedule acknack
// when current pucch is ready to be scheduled nr_fill_nfapi_pucch is called
int
nr_acknack_scheduling
(
int
mod_id
,
int
UE_id
,
frame_t
frame
,
sub_frame_t
slot
)
...
...
@@ -1101,6 +1102,7 @@ bool nr_acknack_scheduling(int mod_id,
const
int
nr_slots_period
=
tdd
->
nrofDownlinkSlots
+
tdd
->
nrofUplinkSlots
+
nr_mix_slots
;
const
int
first_ul_slot_tdd
=
tdd
->
nrofDownlinkSlots
+
nr_slots_period
*
(
slot
/
nr_slots_period
);
const
int
CC_id
=
0
;
NR_sched_pucch_t
*
csi_pucch
;
AssertFatal
(
slot
<
first_ul_slot_tdd
+
(
tdd
->
nrofUplinkSymbols
!=
0
),
"cannot handle multiple TDD periods (yet): slot %d first_ul_slot_tdd %d nrofUplinkSlots %ld
\n
"
,
...
...
@@ -1120,7 +1122,6 @@ bool nr_acknack_scheduling(int mod_id,
"%s(): csi_bits %d in sched_pucch[0]
\n
"
,
__func__
,
pucch
->
csi_bits
);
/* if the currently allocated PUCCH of this UE is full, allocate it */
if
(
pucch
->
dai_c
==
2
)
{
/* advance the UL slot information in PUCCH by one so we won't schedule in
...
...
@@ -1132,17 +1133,13 @@ bool nr_acknack_scheduling(int mod_id,
pucch
->
frame
=
s
==
n_slots_frame
-
1
?
(
f
+
1
)
%
1024
:
f
;
pucch
->
ul_slot
=
(
s
+
1
)
%
n_slots_frame
;
// we assume that only two indices over the array sched_pucch exist
NR_sched_pucch_t
*
csi_pucch
=
&
sched_ctrl
->
sched_pucch
[
1
];
csi_pucch
=
&
sched_ctrl
->
sched_pucch
[
1
];
// skip the CSI PUCCH if it is present and if in the next frame/slot
// and if we don't multiplex
if
(
csi_pucch
->
csi_bits
>
0
&&
csi_pucch
->
frame
==
pucch
->
frame
&&
csi_pucch
->
ul_slot
==
pucch
->
ul_slot
)
{
AssertFatal
(
!
csi_pucch
->
simultaneous_harqcsi
,
"%s(): %d.%d cannot handle simultaneous_harqcsi, but found for UE %d
\n
"
,
__func__
,
pucch
->
frame
,
pucch
->
ul_slot
,
UE_id
);
&&
csi_pucch
->
ul_slot
==
pucch
->
ul_slot
&&
!
csi_pucch
->
simultaneous_harqcsi
)
{
nr_fill_nfapi_pucch
(
mod_id
,
frame
,
slot
,
csi_pucch
,
UE_id
);
memset
(
csi_pucch
,
0
,
sizeof
(
*
csi_pucch
));
pucch
->
frame
=
s
>=
n_slots_frame
-
2
?
(
f
+
1
)
%
1024
:
f
;
...
...
@@ -1156,7 +1153,7 @@ bool nr_acknack_scheduling(int mod_id,
if
((
pucch
->
frame
==
frame
&&
(
pucch
->
ul_slot
>=
first_ul_slot_tdd
+
nr_ulmix_slots
))
||
(
pucch
->
frame
==
frame
+
1
))
return
false
;
return
-
1
;
// this is hardcoded for now as ue specific
NR_SearchSpace__searchSpaceType_PR
ss_type
=
NR_SearchSpace__searchSpaceType_PR_ue_Specific
;
...
...
@@ -1190,7 +1187,7 @@ bool nr_acknack_scheduling(int mod_id,
pucch
->
timing_indicator
=
i
;
pucch
->
dai_c
++
;
// retain old resource indicator, and we are good
return
true
;
return
0
;
}
/* we need to find a new PUCCH occasion */
...
...
@@ -1213,18 +1210,34 @@ bool nr_acknack_scheduling(int mod_id,
// advance ul_slot if it is not reachable by UE
pucch
->
ul_slot
=
max
(
pucch
->
ul_slot
,
slot
+
pdsch_to_harq_feedback
[
0
]);
// Find the right timing_indicator value.
int
i
=
0
;
while
(
i
<
8
)
{
if
(
pdsch_to_harq_feedback
[
i
]
==
pucch
->
ul_slot
-
slot
)
break
;
++
i
;
}
if
(
i
>=
8
)
{
LOG_W
(
MAC
,
"%4d.%2d could not find pdsch_to_harq_feedback for UE %d: earliest "
"ack slot %d
\n
"
,
frame
,
slot
,
UE_id
,
pucch
->
ul_slot
);
return
-
1
;
}
// is there already CSI in this slot?
NR_sched_pucch_t
*
csi_pucch
=
&
sched_ctrl
->
sched_pucch
[
1
];
// skip the CSI PUCCH if it is present and if in the next frame/slot
csi_pucch
=
&
sched_ctrl
->
sched_pucch
[
1
];
if
(
csi_pucch
->
csi_bits
>
0
&&
csi_pucch
->
frame
==
pucch
->
frame
&&
csi_pucch
->
ul_slot
==
pucch
->
ul_slot
)
{
AssertFatal
(
!
csi_pucch
->
simultaneous_harqcsi
,
"%s(): %d.%d cannot handle simultaneous_harqcsi, but found for UE %d
\n
"
,
__func__
,
pucch
->
frame
,
pucch
->
ul_slot
,
UE_id
);
// skip the CSI PUCCH if it is present and if in the next frame/slot
// and if we don't multiplex
// FIXME currently we support at most 11 bits in pucch2 so skip also in that case
if
(
!
csi_pucch
->
simultaneous_harqcsi
||
((
csi_pucch
->
csi_bits
+
csi_pucch
->
dai_c
)
>=
11
))
{
nr_fill_nfapi_pucch
(
mod_id
,
frame
,
slot
,
csi_pucch
,
UE_id
);
memset
(
csi_pucch
,
0
,
sizeof
(
*
csi_pucch
));
/* advance the UL slot information in PUCCH by one so we won't schedule in
...
...
@@ -1236,24 +1249,14 @@ bool nr_acknack_scheduling(int mod_id,
pucch
->
ul_slot
=
(
s
+
1
)
%
n_slots_frame
;
return
nr_acknack_scheduling
(
mod_id
,
UE_id
,
frame
,
slot
);
}
// Find the right timing_indicator value.
int
i
=
0
;
while
(
i
<
8
)
{
if
(
pdsch_to_harq_feedback
[
i
]
==
pucch
->
ul_slot
-
slot
)
break
;
++
i
;
// multiplexing harq and csi in a pucch
else
{
csi_pucch
->
timing_indicator
=
i
;
csi_pucch
->
dai_c
++
;
return
1
;
}
if
(
i
>=
8
)
{
LOG_W
(
MAC
,
"%4d.%2d could not find pdsch_to_harq_feedback for UE %d: earliest "
"ack slot %d
\n
"
,
frame
,
slot
,
UE_id
,
pucch
->
ul_slot
);
return
false
;
}
pucch
->
timing_indicator
=
i
;
// index in the list of timing indicators
pucch
->
dai_c
++
;
...
...
@@ -1272,7 +1275,7 @@ bool nr_acknack_scheduling(int mod_id,
LOG_W
(
MAC
,
"symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d
\n
"
,
symb
,
resource
->
startingPRB
,
pucch
->
frame
,
pucch
->
ul_slot
);
vrb_map_UL
[
resource
->
startingPRB
]
|=
symb
;
}
return
true
;
return
0
;
}
...
...
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
View file @
ca60a69f
...
...
@@ -186,7 +186,7 @@ void nr_csi_meas_reporting(int Mod_idP,
frame_t
frameP
,
sub_frame_t
slotP
);
bool
nr_acknack_scheduling
(
int
Mod_idP
,
int
nr_acknack_scheduling
(
int
Mod_idP
,
int
UE_id
,
frame_t
frameP
,
sub_frame_t
slotP
);
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
ca60a69f
...
...
@@ -389,6 +389,9 @@ typedef struct NR_sched_pdsch {
/// DL HARQ PID to use for this UE, or -1 for "any new"
int8_t
dl_harq_pid
;
// pucch format allocation
uint8_t
pucch_allocation
;
/// the Time Domain Allocation used for this transmission. Note that this is
/// only important for retransmissions; otherwise, the TDA in
/// NR_pdsch_semi_static_t has precedence
...
...
openair2/RRC/NR/rrc_gNB_reconfig.c
View file @
ca60a69f
...
...
@@ -1009,10 +1009,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
pucchfmt2
->
interslotFrequencyHopping
=
NULL
;
pucchfmt2
->
additionalDMRS
=
NULL
;
pucchfmt2
->
maxCodeRate
=
calloc
(
1
,
sizeof
(
*
pucchfmt2
->
maxCodeRate
));
*
pucchfmt2
->
maxCodeRate
=
NR_PUCCH_MaxCodeRate_zeroDot
2
5
;
*
pucchfmt2
->
maxCodeRate
=
NR_PUCCH_MaxCodeRate_zeroDot
3
5
;
pucchfmt2
->
nrofSlots
=
NULL
;
pucchfmt2
->
pi2BPSK
=
NULL
;
pucchfmt2
->
simultaneousHARQ_ACK_CSI
=
NULL
;
pucchfmt2
->
simultaneousHARQ_ACK_CSI
=
calloc
(
1
,
sizeof
(
*
pucchfmt2
->
simultaneousHARQ_ACK_CSI
));
*
pucchfmt2
->
simultaneousHARQ_ACK_CSI
=
NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true
;
// for scheduling requestresource
pucch_Config
->
schedulingRequestResourceToAddModList
=
calloc
(
1
,
sizeof
(
*
pucch_Config
->
schedulingRequestResourceToAddModList
));
...
...
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