From edc53ac9ddc74cd01692b5fe99551af1b8c6b762 Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Mon, 13 Oct 2025 12:39:33 +0200 Subject: [PATCH] OAI UE: add shared RSRP Table 10.1.6.1-1 mapping helper and adopt it RRC UE - Add to common/utils/nr/nr_common remove from NR_MAC_UE/nr_ue_procedures.c - Adopt in asn1_msg.c for MeasurementReport: this solves the following assert: Assertion (enc_rval.encoded > 0) failed! In do_nrMeasurementReport_SA() /oai-ran/openair2/RRC/NR/MESSAGES/asn1_msg.c:898 ASN1 message encoding failed (MeasResultServMOList, 18446744073709551615)! Motivation: unify RSRP-to-index mapping across layers and fix NR RRC MeasurementReport encoding failures due to out-of-range values by reusing the validated mapping. Note NR_RSRP-Range.c constraint: { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */ --- common/utils/nr/nr_common.c | 11 +++++++++++ common/utils/nr/nr_common.h | 3 +++ openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 11 ----------- openair2/RRC/NR/MESSAGES/asn1_msg.c | 8 ++++---- openair2/RRC/NR/MESSAGES/asn1_msg.h | 2 +- openair2/RRC/NR_UE/rrc_UE.c | 3 ++- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 265b680500..8e6a16c97d 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -152,6 +152,17 @@ void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out) #endif } +/** @brief 3GPP TS 38.133 Table 10.1.6.1-1 mapping from dBm to RSRP index */ +uint8_t get_rsrp_index(int rsrp_dBm) +{ + int index = rsrp_dBm + 157; + if (rsrp_dBm > -44) + index = 113; + if (rsrp_dBm < -140) + index = 16; + return (uint8_t)index; +} + // Reverse bits implementation based on http://graphics.stanford.edu/~seander/bithacks.html uint64_t reverse_bits(uint64_t in, int n_bits) { diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 08c0110721..e0d68a45ad 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -186,6 +186,9 @@ typedef struct meas_s { val_init_t csi_rsrp_dBm; } meas_t; +/** @brief Returns NR RSRP index per 3GPP TS 38.133 Table 10.1.6.1-1 */ +uint8_t get_rsrp_index(int rsrp_dBm); + /** * @brief To start a timer * @param timer Timer to be started diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 3d9d5fba43..57c9f404d3 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2916,17 +2916,6 @@ static int compare_ssb_rsrp(const void *a, const void *b) return mb->ssb_rsrp_dBm - ma->ssb_rsrp_dBm; } -// returns index from RSRP -// according to Table 10.1.6.1-1 in 38.133 -static uint8_t get_rsrp_index(int rsrp) -{ - int index = rsrp + 157; - if (rsrp > -44) - index = 113; - if (rsrp < -140) - index = 16; - return index; -} static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, struct NR_CSI_ReportConfig *csi_reportconfig, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 6b65ecd263..f31464822b 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -855,7 +855,7 @@ int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport, long trigger_quantity, long rs_type, uint16_t Nid_cell, - int rsrp_dBm, + int rsrp_index, uint8_t *buffer, size_t buffer_size) { @@ -884,9 +884,9 @@ int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport, struct NR_MeasQuantityResults *active_mq_res = CALLOC(1, sizeof(struct NR_MeasQuantityResults)); if (trigger_quantity == NR_MeasTriggerQuantityOffset_PR_rsrp) { - active_mq_res->rsrp = CALLOC(1, sizeof(NR_RSRP_Range_t)); - - *active_mq_res->rsrp = rsrp_dBm + 157; + asn1cCalloc(active_mq_res->rsrp, rsrp); + // Assign precomputed RSRP index + *rsrp = rsrp_index; if (rs_type == NR_NR_RS_Type_ssb) measResultServingCell->measResult.cellResults.resultsSSB_Cell = active_mq_res; else diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index f347f3428c..73a311084d 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -130,7 +130,7 @@ int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport, long trigger_quantity, long rs_type, uint16_t Nid_cell, - int rsrp_dBm, + int rsrp_index, uint8_t *buffer, size_t buffer_size); diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 10df2c1aec..85e9205a92 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -3242,12 +3242,13 @@ void rrc_ue_generate_measurementReport(rrcPerNB_t *rrc, instance_t ue_id) NR_MeasurementReport_t measurementReport = {0}; l3_measurements_t *l3m = &rrc->l3_measurements; int rsrp_dBm = l3m->rs_type == NR_NR_RS_Type_ssb ? l3m->serving_cell.ss_rsrp_dBm.val : l3m->serving_cell.csi_rsrp_dBm.val; + int rsrp_index = get_rsrp_index(rsrp_dBm); uint8_t size = do_nrMeasurementReport_SA(&measurementReport, l3m->trigger_to_measid, l3m->trigger_quantity, l3m->rs_type, l3m->serving_cell.Nid_cell, - rsrp_dBm, + rsrp_index, buffer, sizeof(buffer));