From 2d7999cb28930912ebf6fa4e579682c96b9c9f89 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 8 Oct 2025 10:44:27 +0200 Subject: [PATCH] fix order of information when encoding/decoding RSRP meaas report with more than 1 resource --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 26 ++++++++----------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 14 +++++----- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 28e7b7d42b..363ce5d098 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2936,13 +2936,13 @@ static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, } else nb_meas = 2; - struct NR_CSI_SSB_ResourceSet__csi_SSB_ResourceList SSB_resource; + struct NR_CSI_SSB_ResourceSet__csi_SSB_ResourceList *SSB_resource = NULL; for (int csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) { if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId == *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){ - SSB_resource = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList; + SSB_resource = &csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList; ///only one SSB resource set from spec 38.331 IE CSI-ResourceConfig - nb_ssb = SSB_resource.list.count; + nb_ssb = SSB_resource->list.count; break; } } @@ -2957,7 +2957,7 @@ static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, for (int measured_ssb_idx = 0; measured_ssb_idx < MAX_NB_SSB; measured_ssb_idx++) { // searching for the SSB index in the SSB resource table for (int ssb_resource = 0; ssb_resource < nb_ssb; ssb_resource++) { - if (*SSB_resource.list.array[ssb_resource] == measured_ssb_idx) { + if (*SSB_resource->list.array[ssb_resource] == measured_ssb_idx) { sorted_rsrp_measurements[sorted_idx].ssb_index = ssb_resource; sorted_rsrp_measurements[sorted_idx].ssb_rsrp_dBm = mac->ssb_measurements[measured_ssb_idx].ssb_rsrp_dBm; sorted_rsrp_measurements[sorted_idx].ssb_sinr_dB = mac->ssb_measurements[measured_ssb_idx].ssb_sinr_dB; @@ -2968,12 +2968,12 @@ static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, } qsort(sorted_rsrp_measurements, nb_ssb, sizeof(NR_RSRP_meas_t), compare_ssb_rsrp); - uint32_t ssbi; - - if (ssbri_bits > 0) { - ssbi = sorted_rsrp_measurements[0].ssb_index; - temp_payload = reverse_bits(ssbi, ssbri_bits); - bits += ssbri_bits; + for (int i = 0; i < nb_meas; i++) { + if (ssbri_bits > 0) { + uint32_t ssbi = sorted_rsrp_measurements[i].ssb_index; + temp_payload |= (reverse_bits(ssbi, ssbri_bits) << bits); + bits += ssbri_bits; + } } uint8_t rsrp_idx = get_rsrp_index(sorted_rsrp_measurements[0].ssb_rsrp_dBm); @@ -2982,15 +2982,11 @@ static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, // from the second SSB, differential report for (int i = 1; i < nb_meas; i++) { - ssbi = sorted_rsrp_measurements[i].ssb_index; - temp_payload |= (reverse_bits(ssbi, ssbri_bits) << bits); - bits += ssbri_bits; - rsrp_idx = get_rsrp_diff_index(sorted_rsrp_measurements[0].ssb_rsrp_dBm,sorted_rsrp_measurements[i].ssb_rsrp_dBm); temp_payload |= (reverse_bits(rsrp_idx, 4) << bits); bits += 4; // 4 bits for subsequent RSRP } - break; // resorce found + break; // resource found } } int max_bits = sizeof(((csi_payload_t *)0)->part1_payload) * 8; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index f3de970683..e689a8a978 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -589,11 +589,13 @@ static void evaluate_rsrp_report(gNB_MAC_INST *nrmac, rsrp_report->nr_reports = csi_report->CSI_report_bitlen.nb_ssbri_cri; int bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen; - uint8_t curr_payload = pickandreverse_bits(payload, bitlen, *cumul_bits); - rsrp_report->resource_id[0] = *(index_list[bitlen > 0 ? ((curr_payload) & ~(~1U << (bitlen - 1))) : bitlen]); - *cumul_bits += bitlen; + for (int i = 0; i < rsrp_report->nr_reports; i++) { + uint8_t idx_payload = pickandreverse_bits(payload, bitlen, *cumul_bits); + rsrp_report->resource_id[i] = *(index_list[bitlen > 0 ? ((idx_payload) & ~(~1U << (bitlen - 1))) : bitlen]); + *cumul_bits += bitlen; + } - curr_payload = pickandreverse_bits(payload, 7, *cumul_bits); + uint8_t curr_payload = pickandreverse_bits(payload, 7, *cumul_bits); int rsrp = curr_payload & 0x7f; *cumul_bits += 7; csi_report->nb_of_csi_ssb_report++; @@ -605,10 +607,6 @@ static void evaluate_rsrp_report(gNB_MAC_INST *nrmac, } for (int i = 1; i < rsrp_report->nr_reports; i++) { - curr_payload = pickandreverse_bits(payload, bitlen, *cumul_bits); - rsrp_report->resource_id[i] = *(index_list[bitlen > 0 ? ((curr_payload) & ~(~1U << (bitlen - 1))) : bitlen]); - *cumul_bits += bitlen; - curr_payload = pickandreverse_bits(payload, 4, *cumul_bits); csi_report->nb_of_csi_ssb_report++; rsrp_report->RSRP[i] = get_diff_rsrp(curr_payload & 0x0f, rsrp_report->RSRP[0]);