From 12e1045d2a003230cc7339dd1c7268a4f2271dcb Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 5 Feb 2024 10:44:43 +0100 Subject: [PATCH] fix for MAC template with CSI report config --- openair2/LAYER2/NR_MAC_COMMON/nr_mac.h | 1 + openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 16 ++++++------ openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 9 ++++--- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 26 +++++++++++++------ .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 2 +- 6 files changed, 35 insertions(+), 21 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index 6202303d65..c8d8232382 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -501,6 +501,7 @@ typedef struct{ } CSI_Meas_bitlen_t; typedef struct nr_csi_report { + NR_CSI_ReportConfigId_t reportConfigId; NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; long periodicity; uint16_t offset; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index df79cbcabd..cdd55fc2d7 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -5028,7 +5028,7 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report // for each CSI measurement report configuration (list of CSI-ReportConfig) LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count); - for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){ + for (csi_report_id = 0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++) { struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; // MAC structure for CSI measurement reports (per UE and per report) nr_csi_report_t *csi_report = &csi_report_template[csi_report_id]; @@ -5051,6 +5051,7 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report reportQuantity_type = csi_reportconfig->reportQuantity.present; csi_report->reportQuantity_type = reportQuantity_type; + csi_report->reportConfigId = csi_reportconfig->reportConfigId; // setting the CSI or SSB index list if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) { @@ -5115,21 +5116,21 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report } } -uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id) { - +uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report) +{ uint16_t csi_bitlen = 0; uint16_t max_bitlen = 0; L1_RSRP_bitlen_t *CSI_report_bitlen = NULL; CSI_Meas_bitlen_t *csi_meas_bitlen = NULL; - if (csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP || - csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) { - CSI_report_bitlen = &(csi_report_template[csi_report_id].CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements + if (csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP || + csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) { + CSI_report_bitlen = &(csi_report->CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) + CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen * (CSI_report_bitlen->nb_ssbri_cri -1 ))); } else { - csi_meas_bitlen = &(csi_report_template[csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements + csi_meas_bitlen = &(csi_report->csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements uint16_t temp_bitlen; for (int i = 0; i < 8; i++) { temp_bitlen = (csi_meas_bitlen->cri_bitlen+ @@ -5143,7 +5144,6 @@ uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_rep } csi_bitlen += max_bitlen; } - return csi_bitlen; } diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index dc9285bc3f..617aa64be2 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -309,7 +309,7 @@ void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template); -uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id); +uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report); uint16_t compute_PDU_length(uint32_t num_TLV, uint16_t total_length); diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index d63a8ff46a..7fd87081ee 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -1964,10 +1964,13 @@ static void configure_csiconfig(NR_UE_ServingCell_Info_t *sc_info, struct NR_Set } } -static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_ServingCellConfig_t *scd) +static void configure_servingcell_info(NR_UE_MAC_INST_t *mac, NR_ServingCellConfig_t *scd) { - if (scd->csi_MeasConfig) + NR_UE_ServingCell_Info_t *sc_info = &mac->sc_info; + if (scd->csi_MeasConfig) { configure_csiconfig(sc_info, scd->csi_MeasConfig); + compute_csi_bitlen(sc_info->csi_MeasConfig, mac->csi_report_template); + } if (scd->supplementaryUplink) UPDATE_IE(sc_info->supplementaryUplink, scd->supplementaryUplink, NR_UplinkConfig_t); @@ -2228,7 +2231,7 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id, handle_reconfiguration_with_sync(mac, cc_idP, spCellConfig->reconfigurationWithSync); } if (scd) { - configure_servingcell_info(&mac->sc_info, scd); + configure_servingcell_info(mac, scd); configure_BWPs(mac, scd); } } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 1c3ee94cec..94cfc384b0 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2805,9 +2805,14 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { - nr_csi_report_t *csi_report = &mac->csi_report_template[csi_idx]; - compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template); - + nr_csi_report_t *csi_report = NULL; + for (int i = 0; i < MAX_CSI_REPORTCONFIG; i++) { + if (mac->csi_report_template[i].reportConfigId == csi_reportconfig->reportConfigId) { + csi_report = &mac->csi_report_template[i]; + break; + } + } + AssertFatal(csi_report, "Couldn't find CSI report with ID %ld\n", csi_reportconfig->reportConfigId); int cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; int ri_bitlen = csi_report->csi_meas_bitlen.ri_bitlen; int pmi_x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[mac->csirs_measurements.rank_indicator]; @@ -2837,7 +2842,7 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, mac->csirs_measurements.i2; } else { - p1_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_idx); + p1_bits = nr_get_csi_bitlen(csi_report); padding_bitlen = p1_bits - (cri_bitlen + ri_bitlen + pmi_x1_bitlen + pmi_x2_bitlen + cqi_bitlen); temp_payload_1 = (0/*mac->csi_measurements.cri*/ << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen + ri_bitlen)) | (mac->csirs_measurements.rank_indicator << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen)) | @@ -2884,10 +2889,15 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { - nr_csi_report_t *csi_report = &mac->csi_report_template[csi_idx]; - compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template); - n_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_idx); - + nr_csi_report_t *csi_report = NULL; + for (int i = 0; i < MAX_CSI_REPORTCONFIG; i++) { + if (mac->csi_report_template[i].reportConfigId == csi_reportconfig->reportConfigId) { + csi_report = &mac->csi_report_template[i]; + break; + } + } + AssertFatal(csi_report, "Couldn't find CSI report with ID %ld\n", csi_reportconfig->reportConfigId); + n_bits = nr_get_csi_bitlen(csi_report); int cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen; int rsrp_bitlen = csi_report->CSI_report_bitlen.rsrp_bitlen; int diff_rsrp_bitlen = csi_report->CSI_report_bitlen.diff_rsrp_bitlen; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index b2a6827d04..20f6810f71 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -273,7 +273,7 @@ void nr_csi_meas_reporting(int Mod_idP, curr_pucch->frame = sched_frame; curr_pucch->ul_slot = sched_slot; curr_pucch->resource_indicator = res_index; - curr_pucch->csi_bits += nr_get_csi_bitlen(UE->csi_report_template, csi_report_id); + curr_pucch->csi_bits += nr_get_csi_bitlen(&UE->csi_report_template[csi_report_id]); curr_pucch->active = true; int bwp_start = ul_bwp->BWPStart;