RRC UE: MeasurementReport refactor

- Simplify do_nrMeasurementReport_SA API (encoder allocates local report)
- Adopt asn1cCalloc consistently
- Minor init cleanup for UL_DCCH message struct
This commit is contained in:
Guido Casati
2025-10-13 16:52:59 +02:00
parent edc53ac9dd
commit d7c3968df2
3 changed files with 14 additions and 22 deletions
+12 -17
View File
@@ -850,8 +850,7 @@ int do_RRCSetupComplete(uint8_t *buffer,
}
// TODO: This function is only implemented for event A2
int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport,
long trigger_to_measid,
int do_nrMeasurementReport_SA(long trigger_to_measid,
long trigger_quantity,
long rs_type,
uint16_t Nid_cell,
@@ -860,29 +859,25 @@ int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport,
size_t buffer_size)
{
asn_enc_rval_t enc_rval;
NR_UL_DCCH_Message_t ul_dcch_msg;
memset((void *)&ul_dcch_msg, 0, sizeof(NR_UL_DCCH_Message_t));
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
ul_dcch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_UL_DCCH_MessageType__c1));
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_measurementReport;
asn1cCalloc(ul_dcch_msg.message.choice.c1, c1);
c1->present = NR_UL_DCCH_MessageType__c1_PR_measurementReport;
memset(measurementReport, 0, sizeof(struct NR_MeasurementReport));
ul_dcch_msg.message.choice.c1->choice.measurementReport = measurementReport;
asn1cCalloc(c1->choice.measurementReport, measurementReport);
measurementReport->criticalExtensions.present = NR_MeasurementReport__criticalExtensions_PR_measurementReport;
NR_MeasurementReport_IEs_t *measurementReport_ie = CALLOC(1, sizeof(struct NR_MeasurementReport_IEs));
measurementReport->criticalExtensions.choice.measurementReport = measurementReport_ie;
measurementReport_ie->measResults.measId = trigger_to_measid;
asn1cCalloc(measurementReport->criticalExtensions.choice.measurementReport, mrIE);
mrIE->measResults.measId = trigger_to_measid;
NR_MeasResultServMO_t *measResultServMo = CALLOC(1, sizeof(struct NR_MeasResultServMO));
NR_MeasResultServMO_t *measResultServMo = calloc_or_fail(1, sizeof(*measResultServMo));
NR_MeasResultNR_t *measResultServingCell = &measResultServMo->measResultServingCell;
measResultServingCell->physCellId = CALLOC(1, sizeof(NR_PhysCellId_t));
*measResultServingCell->physCellId = Nid_cell;
struct NR_MeasQuantityResults *active_mq_res = CALLOC(1, sizeof(struct NR_MeasQuantityResults));
asn1cCalloc(measResultServingCell->physCellId, pci);
*pci = Nid_cell;
struct NR_MeasQuantityResults *active_mq_res = calloc_or_fail(1, sizeof(*active_mq_res));
if (trigger_quantity == NR_MeasTriggerQuantityOffset_PR_rsrp) {
asn1cCalloc(active_mq_res->rsrp, rsrp);
// Assign precomputed RSRP index
@@ -893,7 +888,7 @@ int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport,
measResultServingCell->measResult.cellResults.resultsCSI_RS_Cell = active_mq_res;
}
ASN_SEQUENCE_ADD(&measurementReport_ie->measResults.measResultServingMOList.list, measResultServMo);
ASN_SEQUENCE_ADD(&mrIE->measResults.measResultServingMOList.list, measResultServMo);
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *)&ul_dcch_msg, buffer, buffer_size);
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
+1 -2
View File
@@ -125,8 +125,7 @@ int do_NR_MeasurementTimingConfiguration(const NR_MeasurementTimingConfiguration
int do_RRCSetupRequest(uint8_t *buffer, size_t buffer_size, uint8_t *rv, uint64_t fiveG_S_TMSI_part1);
int do_nrMeasurementReport_SA(NR_MeasurementReport_t *measurementReport,
long trigger_to_measid,
int do_nrMeasurementReport_SA(long trigger_to_measid,
long trigger_quantity,
long rs_type,
uint16_t Nid_cell,
+1 -3
View File
@@ -3239,12 +3239,10 @@ void nr_rrc_set_mac_queue(instance_t instance, notifiedFIFO_t *mac_input_nf)
void rrc_ue_generate_measurementReport(rrcPerNB_t *rrc, instance_t ue_id)
{
uint8_t buffer[NR_RRC_BUF_SIZE];
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,
uint8_t size = do_nrMeasurementReport_SA(l3m->trigger_to_measid,
l3m->trigger_quantity,
l3m->rs_type,
l3m->serving_cell.Nid_cell,