diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 0f7ec6db1a..184b8d5888 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -956,6 +956,42 @@ int do_RRCReestablishmentComplete(uint8_t *buffer, size_t buffer_size, int64_t r return((enc_rval.encoded+7)/8); } +static NR_MeasObjectToAddMod_t *get_MeasObject(const struct NR_MeasTiming__frequencyAndTiming *ft, + int band, + NR_ARFCN_ValueNR_t ssbFrequency, + NR_MeasObjectId_t measObjectId) +{ + const NR_SSB_MTC_t *ssb_mtc = &ft->ssb_MeasurementTimingConfiguration; + NR_MeasObjectToAddMod_t *mo = calloc_or_fail(1, sizeof(*mo)); + mo->measObjectId = measObjectId; + mo->measObject.present = NR_MeasObjectToAddMod__measObject_PR_measObjectNR; + NR_MeasObjectNR_t *monr = calloc_or_fail(1, sizeof(*monr)); + asn1cCallocOne(monr->ssbFrequency, ssbFrequency); + asn1cCallocOne(monr->ssbSubcarrierSpacing, ft->ssbSubcarrierSpacing); + monr->referenceSignalConfig.ssb_ConfigMobility = calloc_or_fail(1, sizeof(*monr->referenceSignalConfig.ssb_ConfigMobility)); + monr->referenceSignalConfig.ssb_ConfigMobility->deriveSSB_IndexFromCell = true; + monr->absThreshSS_BlocksConsolidation = calloc_or_fail(1, sizeof(*monr->absThreshSS_BlocksConsolidation)); + asn1cCallocOne(monr->absThreshSS_BlocksConsolidation->thresholdRSRP, 36); + asn1cCallocOne(monr->nrofSS_BlocksToAverage, 8); + monr->smtc1 = calloc_or_fail(1, sizeof(*monr->smtc1)); + monr->smtc1->periodicityAndOffset = ssb_mtc->periodicityAndOffset; + monr->smtc1->duration = ssb_mtc->duration; + monr->quantityConfigIndex = 1; + monr->ext1 = calloc_or_fail(1, sizeof(*monr->ext1)); + asn1cCallocOne(monr->ext1->freqBandIndicatorNR, band); + mo->measObject.choice.measObjectNR = monr; + return mo; +} + +static NR_MeasIdToAddMod_t *get_MeasId(NR_MeasId_t measId, NR_ReportConfigId_t reportConfigId, NR_MeasObjectId_t measObjectId) +{ + NR_MeasIdToAddMod_t *measid = calloc_or_fail(1, sizeof(NR_MeasIdToAddMod_t)); + measid->measId = measId; + measid->reportConfigId = reportConfigId; + measid->measObjectId = measObjectId; + return measid; +} + NR_MeasConfig_t *get_MeasConfig(const NR_MeasTiming_t *mt, int band, int scs, @@ -964,15 +1000,15 @@ NR_MeasConfig_t *get_MeasConfig(const NR_MeasTiming_t *mt, seq_arr_t *rc_A3_seq, seq_arr_t *pci_seq) { - NR_MeasConfig_t *mc = calloc(1, sizeof(*mc)); - mc->measObjectToAddModList = calloc(1, sizeof(*mc->measObjectToAddModList)); - mc->reportConfigToAddModList = calloc(1, sizeof(*mc->reportConfigToAddModList)); - mc->measIdToAddModList = calloc(1, sizeof(*mc->measIdToAddModList)); + NR_MeasConfig_t *mc = calloc_or_fail(1, sizeof(*mc)); + mc->measObjectToAddModList = calloc_or_fail(1, sizeof(*mc->measObjectToAddModList)); + mc->reportConfigToAddModList = calloc_or_fail(1, sizeof(*mc->reportConfigToAddModList)); + mc->measIdToAddModList = calloc_or_fail(1, sizeof(*mc->measIdToAddModList)); if (rc_PER) asn1cSeqAdd(&mc->reportConfigToAddModList->list, rc_PER); - if (rc_A2) + if (rc_A2) asn1cSeqAdd(&mc->reportConfigToAddModList->list, rc_A2); if (rc_A3_seq) { @@ -984,29 +1020,13 @@ NR_MeasConfig_t *get_MeasConfig(const NR_MeasTiming_t *mt, DevAssert(mt != NULL && mt->frequencyAndTiming != NULL); const struct NR_MeasTiming__frequencyAndTiming *ft = mt->frequencyAndTiming; - const NR_SSB_MTC_t *ssb_mtc = &ft->ssb_MeasurementTimingConfiguration; // Measurement Objects: Specifies what is to be measured. For NR and inter-RAT E-UTRA measurements, this may include // cell-specific offsets, blacklisted cells to be ignored and whitelisted cells to consider for measurements. - NR_MeasObjectToAddMod_t *mo1 = calloc(1, sizeof(*mo1)); - mo1->measObjectId = 1; - mo1->measObject.present = NR_MeasObjectToAddMod__measObject_PR_measObjectNR; - NR_MeasObjectNR_t *monr1 = calloc(1, sizeof(*monr1)); - asn1cCallocOne(monr1->ssbFrequency, ft->carrierFreq); - asn1cCallocOne(monr1->ssbSubcarrierSpacing, ft->ssbSubcarrierSpacing); - monr1->referenceSignalConfig.ssb_ConfigMobility = calloc(1, sizeof(*monr1->referenceSignalConfig.ssb_ConfigMobility)); - monr1->referenceSignalConfig.ssb_ConfigMobility->deriveSSB_IndexFromCell = true; - monr1->absThreshSS_BlocksConsolidation = calloc(1, sizeof(*monr1->absThreshSS_BlocksConsolidation)); - asn1cCallocOne(monr1->absThreshSS_BlocksConsolidation->thresholdRSRP, 36); - asn1cCallocOne(monr1->nrofSS_BlocksToAverage, 8); - monr1->smtc1 = calloc(1, sizeof(*monr1->smtc1)); - monr1->smtc1->periodicityAndOffset = ssb_mtc->periodicityAndOffset; - monr1->smtc1->duration = ssb_mtc->duration; - monr1->quantityConfigIndex = 1; - monr1->ext1 = calloc(1, sizeof(*monr1->ext1)); - asn1cCallocOne(monr1->ext1->freqBandIndicatorNR, band); + NR_MeasObjectToAddMod_t *mo1 = get_MeasObject(ft, band, ft->carrierFreq, 1); if (pci_seq) { + NR_MeasObjectNR_t *monr1 = mo1->measObject.choice.measObjectNR; for (int i = 0; i < pci_seq->size; i++) { if (monr1->cellsToAddModList == NULL) { monr1->cellsToAddModList = calloc(1, sizeof(*monr1->cellsToAddModList)); @@ -1019,22 +1039,18 @@ NR_MeasConfig_t *get_MeasConfig(const NR_MeasTiming_t *mt, } } - mo1->measObject.choice.measObjectNR = monr1; asn1cSeqAdd(&mc->measObjectToAddModList->list, mo1); // Preparation of measId for (uint8_t reportIdx = 0; reportIdx < mc->reportConfigToAddModList->list.count; reportIdx++) { const NR_ReportConfigId_t reportId = mc->reportConfigToAddModList->list.array[reportIdx]->reportConfigId; - NR_MeasIdToAddMod_t *measid = calloc(1, sizeof(NR_MeasIdToAddMod_t)); - measid->measId = reportIdx + 1; - measid->reportConfigId = reportId; - measid->measObjectId = 1; + NR_MeasIdToAddMod_t *measid = get_MeasId(reportIdx + 1, reportId, 1); asn1cSeqAdd(&mc->measIdToAddModList->list, measid); } - mc->quantityConfig = calloc(1, sizeof(*mc->quantityConfig)); - mc->quantityConfig->quantityConfigNR_List = calloc(1, sizeof(*mc->quantityConfig->quantityConfigNR_List)); - NR_QuantityConfigNR_t *qcnr = calloc(1, sizeof(*qcnr)); + mc->quantityConfig = calloc_or_fail(1, sizeof(*mc->quantityConfig)); + mc->quantityConfig->quantityConfigNR_List = calloc_or_fail(1, sizeof(*mc->quantityConfig->quantityConfigNR_List)); + NR_QuantityConfigNR_t *qcnr = calloc_or_fail(1, sizeof(*qcnr)); asn1cCallocOne(qcnr->quantityConfigCell.ssb_FilterConfig.filterCoefficientRSRP, NR_FilterCoefficient_fc6); asn1cCallocOne(qcnr->quantityConfigCell.csi_RS_FilterConfig.filterCoefficientRSRP, NR_FilterCoefficient_fc6); asn1cSeqAdd(&mc->quantityConfig->quantityConfigNR_List->list, qcnr);