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
wangjie
OpenXG-RAN
Commits
5d34f490
Commit
5d34f490
authored
Jun 17, 2021
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
set mcs from csi report
parent
63d0c085
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
129 additions
and
61 deletions
+129
-61
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+1
-1
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+64
-0
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+57
-58
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+4
-0
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+3
-2
No files found.
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
View file @
5d34f490
...
@@ -601,7 +601,7 @@ void pf_dl(module_id_t module_id,
...
@@ -601,7 +601,7 @@ void pf_dl(module_id_t module_id,
continue
;
continue
;
/* Calculate coeff */
/* Calculate coeff */
s
ched_pdsch
->
mcs
=
9
;
s
et_dl_mcs
(
sched_pdsch
,
sched_ctrl
,
ps
->
mcsTableIdx
)
;
uint32_t
tbs
=
pf_tbs
[
ps
->
mcsTableIdx
][
sched_pdsch
->
mcs
];
uint32_t
tbs
=
pf_tbs
[
ps
->
mcsTableIdx
][
sched_pdsch
->
mcs
];
coeff_ue
[
UE_id
]
=
(
float
)
tbs
/
thr_ue
[
UE_id
];
coeff_ue
[
UE_id
]
=
(
float
)
tbs
/
thr_ue
[
UE_id
];
LOG_D
(
NR_MAC
,
"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f
\n
"
,
LOG_D
(
NR_MAC
,
"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f
\n
"
,
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
View file @
5d34f490
...
@@ -112,6 +112,20 @@ uint8_t nr_ss_first_symb_idx_scs_120_120_mux3[4] = {4,8,2,6};
...
@@ -112,6 +112,20 @@ uint8_t nr_ss_first_symb_idx_scs_120_120_mux3[4] = {4,8,2,6};
uint8_t
nr_max_number_of_candidates_per_slot
[
4
]
=
{
44
,
36
,
22
,
20
};
uint8_t
nr_max_number_of_candidates_per_slot
[
4
]
=
{
44
,
36
,
22
,
20
};
uint8_t
nr_max_number_of_cces_per_slot
[
4
]
=
{
56
,
56
,
48
,
32
};
uint8_t
nr_max_number_of_cces_per_slot
[
4
]
=
{
56
,
56
,
48
,
32
};
// CQI TABLES
// Table 1 (38.214 5.2.2.1-2)
uint16_t
cqi_table1
[
16
][
2
]
=
{{
0
,
0
},{
2
,
78
},{
2
,
120
},{
2
,
193
},{
2
,
308
},{
2
,
449
},{
2
,
602
},{
4
,
378
},
{
4
,
490
},{
4
,
616
},{
6
,
466
},{
6
,
567
},{
6
,
666
},{
6
,
772
},{
6
,
873
},{
6
,
948
}};
// Table 2 (38.214 5.2.2.1-3)
uint16_t
cqi_table2
[
16
][
2
]
=
{{
0
,
0
},{
2
,
78
},{
2
,
193
},{
2
,
449
},{
4
,
378
},{
4
,
490
},{
4
,
616
},{
6
,
466
},
{
6
,
567
},{
6
,
666
},{
6
,
772
},{
6
,
873
},{
8
,
711
},{
8
,
797
},{
8
,
885
},{
8
,
948
}};
// Table 2 (38.214 5.2.2.1-4)
uint16_t
cqi_table3
[
16
][
2
]
=
{{
0
,
0
},{
2
,
30
},{
2
,
50
},{
2
,
78
},{
2
,
120
},{
2
,
193
},{
2
,
308
},{
2
,
449
},
{
2
,
602
},{
4
,
378
},{
4
,
490
},{
4
,
616
},{
6
,
466
},{
6
,
567
},{
6
,
666
},{
6
,
772
}};
static
inline
uint8_t
get_max_candidates
(
uint8_t
scs
)
{
static
inline
uint8_t
get_max_candidates
(
uint8_t
scs
)
{
AssertFatal
(
scs
<
4
,
"Invalid PDCCH subcarrier spacing %d
\n
"
,
scs
);
AssertFatal
(
scs
<
4
,
"Invalid PDCCH subcarrier spacing %d
\n
"
,
scs
);
return
(
nr_max_number_of_candidates_per_slot
[
scs
]);
return
(
nr_max_number_of_candidates_per_slot
[
scs
]);
...
@@ -122,6 +136,55 @@ static inline uint8_t get_max_cces(uint8_t scs) {
...
@@ -122,6 +136,55 @@ static inline uint8_t get_max_cces(uint8_t scs) {
return
(
nr_max_number_of_cces_per_slot
[
scs
]);
return
(
nr_max_number_of_cces_per_slot
[
scs
]);
}
}
void
set_dl_mcs
(
NR_sched_pdsch_t
*
sched_pdsch
,
NR_UE_sched_ctrl_t
*
sched_ctrl
,
uint8_t
mcs_table_idx
)
{
if
(
sched_ctrl
->
set_mcs
)
{
// TODO for wideband case and multiple TB
int
cqi_idx
=
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
wb_cqi_1tb
;
uint16_t
target_coderate
,
target_qm
;
if
(
cqi_idx
>
0
)
{
int
cqi_table
=
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
cqi_table
;
AssertFatal
(
cqi_table
==
mcs_table_idx
,
"Indices of MCS tables don't correspond
\n
"
);
switch
(
cqi_table
)
{
case
0
:
target_qm
=
cqi_table1
[
cqi_idx
][
0
];
target_coderate
=
cqi_table1
[
cqi_idx
][
0
];
break
;
case
1
:
target_qm
=
cqi_table2
[
cqi_idx
][
0
];
target_coderate
=
cqi_table2
[
cqi_idx
][
0
];
break
;
case
2
:
target_qm
=
cqi_table3
[
cqi_idx
][
0
];
target_coderate
=
cqi_table3
[
cqi_idx
][
0
];
break
;
default:
AssertFatal
(
1
==
0
,
"Invalid cqi table index %d
\n
"
,
cqi_table
);
}
int
max_mcs
=
28
;
int
R
,
Qm
;
if
(
mcs_table_idx
==
1
)
max_mcs
=
27
;
for
(
int
i
=
0
;
i
<=
max_mcs
;
i
++
)
{
R
=
nr_get_code_rate_dl
(
i
,
mcs_table_idx
);
Qm
=
nr_get_Qm_dl
(
i
,
mcs_table_idx
);
if
((
Qm
==
target_qm
)
&&
(
target_coderate
<=
R
))
{
sched_pdsch
->
mcs
=
i
;
break
;
}
}
}
else
// default value
sched_pdsch
->
mcs
=
9
;
sched_ctrl
->
set_mcs
=
FALSE
;
}
}
NR_ControlResourceSet_t
*
get_coreset
(
NR_ServingCellConfigCommon_t
*
scc
,
NR_ControlResourceSet_t
*
get_coreset
(
NR_ServingCellConfigCommon_t
*
scc
,
NR_BWP_Downlink_t
*
bwp
,
NR_BWP_Downlink_t
*
bwp
,
NR_SearchSpace_t
*
ss
,
NR_SearchSpace_t
*
ss
,
...
@@ -1839,6 +1902,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
...
@@ -1839,6 +1902,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
compute_csi_bitlen
(
CellGroup
->
spCellConfig
->
spCellConfigDedicated
->
csi_MeasConfig
->
choice
.
setup
,
UE_info
,
UE_id
,
mod_idP
);
compute_csi_bitlen
(
CellGroup
->
spCellConfig
->
spCellConfigDedicated
->
csi_MeasConfig
->
choice
.
setup
,
UE_info
,
UE_id
,
mod_idP
);
NR_UE_sched_ctrl_t
*
sched_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
NR_UE_sched_ctrl_t
*
sched_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
memset
(
sched_ctrl
,
0
,
sizeof
(
*
sched_ctrl
));
memset
(
sched_ctrl
,
0
,
sizeof
(
*
sched_ctrl
));
sched_ctrl
->
set_mcs
=
TRUE
;
sched_ctrl
->
ta_frame
=
0
;
sched_ctrl
->
ta_frame
=
0
;
sched_ctrl
->
ta_update
=
31
;
sched_ctrl
->
ta_update
=
31
;
sched_ctrl
->
ta_apply
=
false
;
sched_ctrl
->
ta_apply
=
false
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
View file @
5d34f490
...
@@ -921,37 +921,34 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
...
@@ -921,37 +921,34 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
idx: resource set index
idx: resource set index
*/
*/
//for all reported SSB
nr_ssbri_cri
=
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
;
for
(
idx
=
0
;
idx
<
nb_of_csi_ssb_report
;
idx
++
)
{
//extracting the ssb indexes
nr_ssbri_cri
=
sched_ctrl
->
CSI_report
[
idx
].
choice
.
ssb_cri_report
.
nr_ssbri_cri
;
for
(
ssb_idx
=
0
;
ssb_idx
<
nr_ssbri_cri
;
ssb_idx
++
)
{
//extracting the ssb indexes
ssb_index
[
idx
*
nb_of_csi_ssb_report
+
ssb_idx
]
=
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
ssb_idx
];
for
(
ssb_idx
=
0
;
ssb_idx
<
nr_ssbri_cri
;
ssb_idx
++
)
{
}
ssb_index
[
idx
*
nb_of_csi_ssb_report
+
ssb_idx
]
=
sched_ctrl
->
CSI_report
[
idx
].
choice
.
ssb_cri_report
.
CRI_SSBRI
[
ssb_idx
];
}
//if strongest measured RSRP is configured
//if strongest measured RSRP is configured
strongest_ssb_rsrp
=
get_measured_rsrp
(
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
RSRP
);
strongest_ssb_rsrp
=
get_measured_rsrp
(
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
RSRP
);
// including ssb rsrp in mac stats
// including ssb rsrp in mac stats
stats
->
cumul_rsrp
+=
strongest_ssb_rsrp
;
stats
->
cumul_rsrp
+=
strongest_ssb_rsrp
;
stats
->
num_rsrp_meas
++
;
stats
->
num_rsrp_meas
++
;
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
]
=
strongest_ssb_rsrp
;
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
]
=
strongest_ssb_rsrp
;
LOG_D
(
MAC
,
"ssb_rsrp = %d
\n
"
,
strongest_ssb_rsrp
);
LOG_D
(
MAC
,
"ssb_rsrp = %d
\n
"
,
strongest_ssb_rsrp
);
//if current ssb rsrp is greater than better rsrp
//if current ssb rsrp is greater than better rsrp
if
(
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
]
>
better_rsrp_reported
)
{
if
(
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
]
>
better_rsrp_reported
)
{
better_rsrp_reported
=
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
];
better_rsrp_reported
=
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
];
target_ssb_beam_index
=
idx
*
nb_of_csi_ssb_report
;
target_ssb_beam_index
=
idx
*
nb_of_csi_ssb_report
;
}
}
for
(
diff_rsrp_idx
=
1
;
diff_rsrp_idx
<
nr_ssbri_cri
;
diff_rsrp_idx
++
)
{
for
(
diff_rsrp_idx
=
1
;
diff_rsrp_idx
<
nr_ssbri_cri
;
diff_rsrp_idx
++
)
{
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
]
=
get_diff_rsrp
(
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
diff_RSRP
[
diff_rsrp_idx
-
1
],
strongest_ssb_rsrp
);
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
]
=
get_diff_rsrp
(
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
diff_RSRP
[
diff_rsrp_idx
-
1
],
strongest_ssb_rsrp
);
//if current reported rsrp is greater than better rsrp
//if current reported rsrp is greater than better rsrp
if
(
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
]
>
better_rsrp_reported
)
{
if
(
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
]
>
better_rsrp_reported
)
{
better_rsrp_reported
=
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
];
better_rsrp_reported
=
ssb_rsrp
[
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
];
target_ssb_beam_index
=
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
;
target_ssb_beam_index
=
idx
*
nb_of_csi_ssb_report
+
diff_rsrp_idx
;
}
}
}
}
}
...
@@ -1103,36 +1100,35 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
...
@@ -1103,36 +1100,35 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
multiple simultaneous spatial domain receive filter
multiple simultaneous spatial domain receive filter
*/
*/
int
idx
=
0
;
//Since for SSB RSRP reporting in RRC can configure only one ssb resource set per one report config
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
=
csi_report
->
CSI_report_bitlen
.
nb_ssbri_cri
;
sched_ctrl
->
CSI_report
[
idx
].
choice
.
ssb_cri_report
.
nr_ssbri_cri
=
csi_report
->
CSI_report_bitlen
.
nb_ssbri_cri
;
for
(
int
csi_ssb_idx
=
0
;
csi_ssb_idx
<
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
;
csi_ssb_idx
++
)
{
for
(
int
csi_ssb_idx
=
0
;
csi_ssb_idx
<
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
;
csi_ssb_idx
++
)
{
curr_payload
=
pickandreverse_bits
(
payload
,
cri_ssbri_bitlen
,
*
cumul_bits
);
curr_payload
=
pickandreverse_bits
(
payload
,
cri_ssbri_bitlen
,
*
cumul_bits
);
if
(
NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP
==
reportQuantity_type
)
if
(
NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP
==
reportQuantity_type
)
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]
=
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]
=
*
(
csi_report
->
SSB_Index_list
[
cri_ssbri_bitlen
>
0
?
((
curr_payload
)
&~
(
~
1
<<
(
cri_ssbri_bitlen
-
1
)))
:
cri_ssbri_bitlen
]);
*
(
csi_report
->
SSB_Index_list
[
cri_ssbri_bitlen
>
0
?
((
curr_payload
)
&~
(
~
1
<<
(
cri_ssbri_bitlen
-
1
)))
:
cri_ssbri_bitlen
]);
else
else
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]
=
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]
=
*
(
csi_report
->
CSI_Index_list
[
cri_ssbri_bitlen
>
0
?
((
curr_payload
)
&~
(
~
1
<<
(
cri_ssbri_bitlen
-
1
)))
:
cri_ssbri_bitlen
]);
*
(
csi_report
->
CSI_Index_list
[
cri_ssbri_bitlen
>
0
?
((
curr_payload
)
&~
(
~
1
<<
(
cri_ssbri_bitlen
-
1
)))
:
cri_ssbri_bitlen
]);
*
cumul_bits
+=
cri_ssbri_bitlen
;
*
cumul_bits
+=
cri_ssbri_bitlen
;
LOG_D
(
MAC
,
"SSB_index = %d
\n
"
,
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]);
LOG_D
(
MAC
,
"SSB_index = %d
\n
"
,
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
CRI_SSBRI
[
csi_ssb_idx
]);
}
}
curr_payload
=
pickandreverse_bits
(
payload
,
7
,
*
cumul_bits
);
curr_payload
=
pickandreverse_bits
(
payload
,
7
,
*
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
RSRP
=
curr_payload
&
0x7f
;
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
RSRP
=
curr_payload
&
0x7f
;
*
cumul_bits
+=
7
;
*
cumul_bits
+=
7
;
for
(
int
diff_rsrp_idx
=
0
;
diff_rsrp_idx
<
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
-
1
;
diff_rsrp_idx
++
)
{
for
(
int
diff_rsrp_idx
=
0
;
diff_rsrp_idx
<
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
nr_ssbri_cri
-
1
;
diff_rsrp_idx
++
)
{
curr_payload
=
pickandreverse_bits
(
payload
,
4
,
*
cumul_bits
);
curr_payload
=
pickandreverse_bits
(
payload
,
4
,
*
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
diff_RSRP
[
diff_rsrp_idx
]
=
curr_payload
&
0x0f
;
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
diff_RSRP
[
diff_rsrp_idx
]
=
curr_payload
&
0x0f
;
*
cumul_bits
+=
4
;
*
cumul_bits
+=
4
;
}
}
csi_report
->
nb_of_csi_ssb_report
++
;
csi_report
->
nb_of_csi_ssb_report
++
;
LOG_D
(
MAC
,
"rsrp_id = %d rsrp = %d
\n
"
,
LOG_D
(
MAC
,
"rsrp_id = %d rsrp = %d
\n
"
,
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
RSRP
,
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
RSRP
,
get_measured_rsrp
(
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
ssb_cri_report
.
RSRP
));
get_measured_rsrp
(
sched_ctrl
->
CSI_report
.
choice
.
ssb_cri_report
.
RSRP
));
}
}
...
@@ -1141,10 +1137,8 @@ void evaluate_cri_report(uint8_t *payload,
...
@@ -1141,10 +1137,8 @@ void evaluate_cri_report(uint8_t *payload,
int
cumul_bits
,
int
cumul_bits
,
NR_UE_sched_ctrl_t
*
sched_ctrl
){
NR_UE_sched_ctrl_t
*
sched_ctrl
){
int
idx
=
0
;
// FIXME not sure about this index. Should it be the same as csi_report_id?
uint8_t
temp_cri
=
pickandreverse_bits
(
payload
,
cri_bitlen
,
cumul_bits
);
uint8_t
temp_cri
=
pickandreverse_bits
(
payload
,
cri_bitlen
,
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
cri
=
temp_cri
;
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
cri
=
temp_cri
;
}
}
int
evaluate_ri_report
(
uint8_t
*
payload
,
int
evaluate_ri_report
(
uint8_t
*
payload
,
...
@@ -1153,13 +1147,12 @@ int evaluate_ri_report(uint8_t *payload,
...
@@ -1153,13 +1147,12 @@ int evaluate_ri_report(uint8_t *payload,
int
cumul_bits
,
int
cumul_bits
,
NR_UE_sched_ctrl_t
*
sched_ctrl
){
NR_UE_sched_ctrl_t
*
sched_ctrl
){
int
idx
=
0
;
// FIXME not sure about this index. Should it be the same as csi_report_id?
uint8_t
ri_index
=
pickandreverse_bits
(
payload
,
ri_bitlen
,
cumul_bits
);
uint8_t
ri_index
=
pickandreverse_bits
(
payload
,
ri_bitlen
,
cumul_bits
);
int
count
=
0
;
int
count
=
0
;
for
(
int
i
=
0
;
i
<
8
;
i
++
)
{
for
(
int
i
=
0
;
i
<
8
;
i
++
)
{
if
((
ri_restriction
>>
i
)
&
0x01
)
{
if
((
ri_restriction
>>
i
)
&
0x01
)
{
if
(
count
==
ri_index
)
{
if
(
count
==
ri_index
)
{
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
ri
=
i
;
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
ri
=
i
;
LOG_I
(
MAC
,
"CSI Reported Rank %d
\n
"
,
i
+
1
);
LOG_I
(
MAC
,
"CSI Reported Rank %d
\n
"
,
i
+
1
);
return
i
;
return
i
;
}
}
...
@@ -1174,21 +1167,29 @@ void evaluate_cqi_report(uint8_t *payload,
...
@@ -1174,21 +1167,29 @@ void evaluate_cqi_report(uint8_t *payload,
nr_csi_report_t
*
csi_report
,
nr_csi_report_t
*
csi_report
,
int
cumul_bits
,
int
cumul_bits
,
uint8_t
ri
,
uint8_t
ri
,
NR_UE_sched_ctrl_t
*
sched_ctrl
){
NR_UE_sched_ctrl_t
*
sched_ctrl
,
long
*
cqi_Table
){
//TODO sub-band CQI report not yet implemented
//TODO sub-band CQI report not yet implemented
int
idx
=
0
;
// FIXME not sure about this index. Should it be the same as csi_report_id?
int
cqi_bitlen
=
csi_report
->
csi_meas_bitlen
.
cqi_bitlen
[
ri
];
int
cqi_bitlen
=
csi_report
->
csi_meas_bitlen
.
cqi_bitlen
[
ri
];
uint8_t
temp_cqi
=
pickandreverse_bits
(
payload
,
4
,
cumul_bits
);
uint8_t
temp_cqi
=
pickandreverse_bits
(
payload
,
4
,
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
].
choice
.
cri_ri_li_pmi_cqi_report
.
wb_cqi_1tb
=
temp_cqi
;
// NR_CSI_ReportConfig__cqi_Table_table1 = 0
// NR_CSI_ReportConfig__cqi_Table_table2 = 1
// NR_CSI_ReportConfig__cqi_Table_table3 = 2
if
(
cqi_Table
)
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
cqi_table
=
*
cqi_Table
;
else
AssertFatal
(
1
==
0
,
"CQI Table not present in RRC configuration
\n
"
);
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
wb_cqi_1tb
=
temp_cqi
;
LOG_I
(
MAC
,
"Wide-band CQI for the first TB %d
\n
"
,
temp_cqi
);
LOG_I
(
MAC
,
"Wide-band CQI for the first TB %d
\n
"
,
temp_cqi
);
if
(
cqi_bitlen
>
4
)
{
if
(
cqi_bitlen
>
4
)
{
temp_cqi
=
pickandreverse_bits
(
payload
,
4
,
cumul_bits
);
temp_cqi
=
pickandreverse_bits
(
payload
,
4
,
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
wb_cqi_2tb
=
temp_cqi
;
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
wb_cqi_2tb
=
temp_cqi
;
LOG_D
(
MAC
,
"Wide-band CQI for the second TB %d
\n
"
,
temp_cqi
);
LOG_D
(
MAC
,
"Wide-band CQI for the second TB %d
\n
"
,
temp_cqi
);
}
}
sched_ctrl
->
set_mcs
=
TRUE
;
}
}
...
@@ -1198,7 +1199,6 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
...
@@ -1198,7 +1199,6 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
uint8_t
ri
,
uint8_t
ri
,
NR_UE_sched_ctrl_t
*
sched_ctrl
){
NR_UE_sched_ctrl_t
*
sched_ctrl
){
int
idx
=
0
;
// FIXME not sure about this index. Should it be the same as csi_report_id?
int
x1_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x1_bitlen
[
ri
];
int
x1_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x1_bitlen
[
ri
];
int
x2_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x2_bitlen
[
ri
];
int
x2_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x2_bitlen
[
ri
];
int
tot_bitlen
=
x1_bitlen
+
x2_bitlen
;
int
tot_bitlen
=
x1_bitlen
+
x2_bitlen
;
...
@@ -1206,11 +1206,11 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
...
@@ -1206,11 +1206,11 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
//in case of 2 port CSI configuration x1 is empty and the information bits are in x2
//in case of 2 port CSI configuration x1 is empty and the information bits are in x2
int
temp_pmi
=
pickandreverse_bits
(
payload
,
tot_bitlen
,
cumul_bits
);
int
temp_pmi
=
pickandreverse_bits
(
payload
,
tot_bitlen
,
cumul_bits
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x1
=
temp_pmi
&
((
1
<<
x1_bitlen
)
-
1
);
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x1
=
temp_pmi
&
((
1
<<
x1_bitlen
)
-
1
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x2
=
(
temp_pmi
>>
x1_bitlen
)
&
((
1
<<
x2_bitlen
)
-
1
);
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x2
=
(
temp_pmi
>>
x1_bitlen
)
&
((
1
<<
x2_bitlen
)
-
1
);
LOG_I
(
MAC
,
"PMI Report: X1 %d X2 %d
\n
"
,
LOG_I
(
MAC
,
"PMI Report: X1 %d X2 %d
\n
"
,
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x1
,
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x1
,
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x2
);
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
pmi_x2
);
return
tot_bitlen
;
return
tot_bitlen
;
...
@@ -1223,13 +1223,12 @@ int evaluate_li_report(uint8_t *payload,
...
@@ -1223,13 +1223,12 @@ int evaluate_li_report(uint8_t *payload,
uint8_t
ri
,
uint8_t
ri
,
NR_UE_sched_ctrl_t
*
sched_ctrl
){
NR_UE_sched_ctrl_t
*
sched_ctrl
){
int
idx
=
0
;
// FIXME not sure about this index. Should it be the same as csi_report_id?
int
li_bitlen
=
csi_report
->
csi_meas_bitlen
.
li_bitlen
[
ri
];
int
li_bitlen
=
csi_report
->
csi_meas_bitlen
.
li_bitlen
[
ri
];
if
(
li_bitlen
>
0
)
{
if
(
li_bitlen
>
0
)
{
int
temp_li
=
pickandreverse_bits
(
payload
,
li_bitlen
,
cumul_bits
);
int
temp_li
=
pickandreverse_bits
(
payload
,
li_bitlen
,
cumul_bits
);
LOG_I
(
MAC
,
"LI %d
\n
"
,
temp_li
);
LOG_I
(
MAC
,
"LI %d
\n
"
,
temp_li
);
sched_ctrl
->
CSI_report
[
idx
]
.
choice
.
cri_ri_li_pmi_cqi_report
.
li
=
temp_li
;
sched_ctrl
->
CSI_report
.
choice
.
cri_ri_li_pmi_cqi_report
.
li
=
temp_li
;
}
}
return
li_bitlen
;
return
li_bitlen
;
...
@@ -1304,7 +1303,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
...
@@ -1304,7 +1303,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
cumul_bits
+=
ri_bitlen
;
cumul_bits
+=
ri_bitlen
;
if
(
r_index
!=
-
1
)
if
(
r_index
!=
-
1
)
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
,
csirep
->
cqi_Table
);
break
;
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI
:
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI
:
cri_bitlen
=
csi_report
->
csi_meas_bitlen
.
cri_bitlen
;
cri_bitlen
=
csi_report
->
csi_meas_bitlen
.
cri_bitlen
;
...
@@ -1319,7 +1318,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
...
@@ -1319,7 +1318,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
pmi_bitlen
=
evaluate_pmi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
pmi_bitlen
=
evaluate_pmi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
cumul_bits
+=
pmi_bitlen
;
cumul_bits
+=
pmi_bitlen
;
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
,
csirep
->
cqi_Table
);
break
;
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI
:
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI
:
cri_bitlen
=
csi_report
->
csi_meas_bitlen
.
cri_bitlen
;
cri_bitlen
=
csi_report
->
csi_meas_bitlen
.
cri_bitlen
;
...
@@ -1336,7 +1335,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
...
@@ -1336,7 +1335,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
skip_zero_padding
(
&
cumul_bits
,
csi_report
,
r_index
,
bitlen
);
pmi_bitlen
=
evaluate_pmi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
pmi_bitlen
=
evaluate_pmi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
cumul_bits
+=
pmi_bitlen
;
cumul_bits
+=
pmi_bitlen
;
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
);
evaluate_cqi_report
(
payload
,
csi_report
,
cumul_bits
,
r_index
,
sched_ctrl
,
csirep
->
cqi_Table
);
break
;
break
;
default:
default:
AssertFatal
(
1
==
0
,
"Invalid or not supported CSI measurement report
\n
"
);
AssertFatal
(
1
==
0
,
"Invalid or not supported CSI measurement report
\n
"
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
View file @
5d34f490
...
@@ -415,6 +415,10 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
...
@@ -415,6 +415,10 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
void
find_SSB_and_RO_available
(
module_id_t
module_idP
);
void
find_SSB_and_RO_available
(
module_id_t
module_idP
);
void
set_dl_mcs
(
NR_sched_pdsch_t
*
sched_pdsch
,
NR_UE_sched_ctrl_t
*
sched_ctrl
,
uint8_t
mcs_table_idx
);
void
calculate_preferred_dl_tda
(
module_id_t
module_id
,
const
NR_BWP_Downlink_t
*
bwp
);
void
calculate_preferred_dl_tda
(
module_id_t
module_id
,
const
NR_BWP_Downlink_t
*
bwp
);
void
calculate_preferred_ul_tda
(
module_id_t
module_id
,
const
NR_BWP_Uplink_t
*
ubwp
);
void
calculate_preferred_ul_tda
(
module_id_t
module_id
,
const
NR_BWP_Uplink_t
*
ubwp
);
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
5d34f490
...
@@ -441,6 +441,7 @@ struct CRI_RI_LI_PMI_CQI {
...
@@ -441,6 +441,7 @@ struct CRI_RI_LI_PMI_CQI {
uint8_t
pmi_x2
;
uint8_t
pmi_x2
;
uint8_t
wb_cqi_1tb
;
uint8_t
wb_cqi_1tb
;
uint8_t
wb_cqi_2tb
;
uint8_t
wb_cqi_2tb
;
uint8_t
cqi_table
;
};
};
typedef
struct
CRI_SSB_RSRP
{
typedef
struct
CRI_SSB_RSRP
{
...
@@ -573,9 +574,9 @@ typedef struct {
...
@@ -573,9 +574,9 @@ typedef struct {
int
pusch_consecutive_dtx_cnt
;
int
pusch_consecutive_dtx_cnt
;
int
pucch_consecutive_dtx_cnt
;
int
pucch_consecutive_dtx_cnt
;
int
ul_failure
;
int
ul_failure
;
struct
CSI_Report
CSI_report
[
MAX_CSI_REPORTS
]
;
struct
CSI_Report
CSI_report
;
bool
SR
;
bool
SR
;
bool
set_mcs
;
/// information about every HARQ process
/// information about every HARQ process
NR_UE_harq_t
harq_processes
[
NR_MAX_NB_HARQ_PROCESSES
];
NR_UE_harq_t
harq_processes
[
NR_MAX_NB_HARQ_PROCESSES
];
/// HARQ processes that are free
/// HARQ processes that are free
...
...
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