+
+/*******************************************************************
+ *
+ * @brief Frees Measurement Timing configuration
+ *
+ * @details
+ *
+ * Function : FreeMeasTimingConf
+ *
+ * Functionality: Frees Timing Configuration
+ *
+ * @params[in] MeasurementTimingConfigurationRrc_t measTimingConfRrc
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void FreeMeasTimingConf(MeasurementTimingConfigurationRrc_t measTimingConfRrc)
+{
+ uint8_t measIeIdx = 0;
+ MeasurementTimingConfigurationRrc_IEs_t *measTimingConfIEs = NULLP;
+
+ if(measTimingConfRrc.criticalExtensions.choice.c1)
+ {
+ if(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf)
+ {
+ measTimingConfIEs = measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf;
+ if(measTimingConfIEs->measTiming)
+ {
+ if(measTimingConfIEs->measTiming->list.array)
+ {
+ for(measIeIdx = 0; measIeIdx < measTimingConfIEs->measTiming->list.count; measIeIdx++)
+ {
+ if(measTimingConfIEs->measTiming->list.array[measIeIdx])
+ {
+ DU_FREE(measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
+ DU_FREE(measTimingConfIEs->measTiming->list.array[measIeIdx], sizeof(MeasTiming_t));
+ }
+ }
+ DU_FREE(measTimingConfIEs->measTiming->list.array, measTimingConfIEs->measTiming->list.size);
+ }
+ DU_FREE(measTimingConfIEs->measTiming, sizeof(MeasTimingList_t));
+ }
+ DU_FREE(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(MeasurementTimingConfigurationRrc_IEs_t));
+ }
+ DU_FREE(measTimingConfRrc.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Builds MEasuerment Timing Configuration
+ *
+ * @details
+ *
+ * Function : BuildMeasTimingConf
+ *
+ * Functionality: Building Measurement Timing Configuration
+ *
+ * @params[in] Pointer to octet string to store Measurement timing
+ * Configuration
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildMeasTimingConf(OCTET_STRING_t *measTimingConf)
+{
+ uint8_t ret = RFAILED;
+ uint8_t elementCnt = 0;
+ uint8_t measIeIdx = 0;
+ asn_enc_rval_t encRetVal;
+ MeasurementTimingConfigurationRrc_t measTimingConfRrc;
+ MeasurementTimingConfigurationRrc_IEs_t *measTimingConfIEs = NULLP;
+ struct MeasTiming__frequencyAndTiming *freqAndTiming = NULLP;
+
+ while(true)
+ {
+ measTimingConfRrc.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1;
+ DU_ALLOC(measTimingConfRrc.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1));
+ if(!measTimingConfRrc.criticalExtensions.choice.c1)
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for critical extension choice C1");
+ break;
+ }
+ measTimingConfRrc.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf;
+
+ DU_ALLOC(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(MeasurementTimingConfigurationRrc_IEs_t));
+ if(!measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf)
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for measTimingConf");
+ break;
+ }
+ measTimingConfIEs = measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf;
+
+ DU_ALLOC(measTimingConfIEs->measTiming, sizeof(MeasTimingList_t));
+ if(!measTimingConfIEs->measTiming)
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList");
+ break;
+ }
+
+ elementCnt = 1;
+ measTimingConfIEs->measTiming->list.count = elementCnt;
+ measTimingConfIEs->measTiming->list.size = elementCnt * sizeof(MeasTiming_t *);
+ DU_ALLOC(measTimingConfIEs->measTiming->list.array, measTimingConfIEs->measTiming->list.size);
+ if(!measTimingConfIEs->measTiming->list.array)
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList array");
+ break;
+ }
+
+ for(measIeIdx = 0; measIeIdx < elementCnt; measIeIdx++)
+ {
+ DU_ALLOC(measTimingConfIEs->measTiming->list.array[measIeIdx], sizeof(MeasTiming_t));
+ if(!measTimingConfIEs->measTiming->list.array[measIeIdx])
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList array index %d", measIeIdx);
+ break;
+ }
+ }
+ if(measIeIdx < elementCnt)
+ {
+ break;
+ }
+
+ measIeIdx = 0;
+ DU_ALLOC(measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming));
+ if(!measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming)
+ {
+ DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for frequencyAndTiming");
+ break;
+ }
+ freqAndTiming = measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming;
+ freqAndTiming->carrierFreq = MEAS_TIMING_ARFCN;
+ freqAndTiming->ssbSubcarrierSpacing = duCfgParam.macCellCfg.ssbCfg.scsCmn;
+ freqAndTiming->ssb_MeasurementTimingConfiguration.periodicityAndOffset.present = duCfgParam.macCellCfg.ssbCfg.ssbPeriod + 1;
+ freqAndTiming->ssb_MeasurementTimingConfiguration.periodicityAndOffset.choice.sf20 = duCfgParam.macCellCfg.ssbCfg.ssbScOffset;
+ freqAndTiming->ssb_MeasurementTimingConfiguration.duration = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfgDuration;
+
+ /* Encode the F1SetupRequest type as APER */
+ xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfRrc);
+
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfRrc, PrepFinalEncBuf, encBuf);
+
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("\nERROR --> F1AP : Could not encode Measurement Timing Configuration structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Measurement Timing Configuration \n");
+#ifdef DEBUG_ASN_PRINT
+ for(measIeIdx=0; measIeIdx< encBufSize; measIeIdx++)
+ {
+ printf("%x",encBuf[measIeIdx]);
+ }
+#endif
+
+ measTimingConf->size = encBufSize;
+ DU_ALLOC(measTimingConf->buf, encBufSize);
+ if(measTimingConf->buf == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed for MeasurementTimingConfiguration buffer");
+ return RFAILED;
+ }
+ memcpy(measTimingConf->buf, &encBuf, encBufSize);
+
+ FreeMeasTimingConf(measTimingConfRrc);
+
+ ret = ROK;
+ break;
+ }
+ }
+ return ret;
+}
+