################################################################################
*******************************************************************************/
#include "common_def.h"
+#include <sys/time.h>
#include "du_tmr.h"
#include "lrg.h"
#include "lkw.x"
*subscriptionId |= ((uint64_t)ranFuncId << 32);
}
+/*******************************************************************
+ *
+ * @brief Stores the current time at the start of reporting period
+ *
+ * @details
+ *
+ * Function : storeReportStartTime
+ *
+ * Functionality: Stores the current time at the start of
+ * reporting period
+ *
+ * @params[in] Start Timer to be stored
+ * @return Void
+ *
+ * ****************************************************************/
+void storeReportStartTime(ReportStartTime *startTime)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ startTime->timeInSec = tv.tv_sec;
+ startTime->timeInMilliSec = (tv.tv_usec/1000);
+}
+
+
+/*******************************************************************
+ *
+ * @brief Fetch Measurement Info using measurement type name
+ *
+ * @details
+ *
+ * Function : fetchMeasInfoFromMeasTypeName
+ *
+ * Functionality: Fetch Measurement Info using measurement type name
+ *
+ * @params[in] Measurement type name to search
+ * Measurement Info list to search from
+ * Measurement Info node found from list
+ * @return Measurement Info DB
+ *
+ * ****************************************************************/
+MeasurementInfo *fetchMeasInfoFromMeasTypeName(char *e2MeasTypeName, CmLListCp *measInfoList, CmLList **measInfoNode)
+{
+ MeasurementInfo *measInfo = NULLP;
+
+ /* Fetch subscription detail in RAN Function DB */
+ CM_LLIST_FIRST_NODE(measInfoList, *measInfoNode);
+ while(*measInfoNode)
+ {
+ measInfo = (MeasurementInfo *)((*measInfoNode)->node);
+ if(measInfo && !strcmp(e2MeasTypeName, measInfo->measurementTypeName))
+ {
+ break;
+ }
+ *measInfoNode = (*measInfoNode)->next;
+ measInfo = NULLP;
+ }
+
+ if(!measInfo)
+ {
+ DU_LOG("\nERROR --> E2AP : fetchMeasInfoFromMeasTypeName: Measurement [%s] not found", e2MeasTypeName);
+ }
+
+ return measInfo;
+}
+
/*******************************************************************
*
* @brief Fetch Action details
ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo)
{
ActionInfo *actionInfoDb = NULLP;
- if(ricSubscriptionInfo->actionSequence[actionId-1].id == actionId)
+ if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
{
- actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId-1];
+ actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId];
}
else
{
- DU_LOG("\nERROR --> DU_APP : fetchActionInfoFromActionId: Action Id [%d] not found in \
+ DU_LOG("\nERROR --> E2AP : fetchActionInfoFromActionId: Action Id [%d] not found in \
subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\
ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId);
if(!ricSubscriptionInfo)
{
- DU_LOG("\nERROR --> DU_APP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
+ DU_LOG("\nERROR --> E2AP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
Instance ID [%d] in RAN Function ID [%d]", ricReqId.requestorId, ricReqId.instanceId, ranFuncDb->id);
}
}
else
{
- DU_LOG("\nERROR --> DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
+ DU_LOG("\nERROR --> E2AP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
}
return ranFuncDb;
* Request
*
* @params[in] MAC Statistics Request to be filled
- * RAN Function ID
* RIC Subscription Info
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t fillRicSubsInMacStatsReq(MacStatsReq *macStatsReq, uint16_t ranFuncId, RicSubscription* ricSubscriptionInfo)
+uint8_t fillRicSubsInMacStatsReq(MacStatsReq *macStatsReq, RicSubscription* ricSubscriptionInfo)
{
uint8_t actionIdx = 0, grpIdx = 0, statsIdx = 0;
uint64_t subscriptionId = 0;
ActionDefFormat1 *format1Action = NULLP;
/* Generate subscription ID using RIC Request ID and RAN Function ID */
- encodeSubscriptionId(&subscriptionId, ranFuncId, ricSubscriptionInfo->requestId);
+ encodeSubscriptionId(&subscriptionId, ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId);
macStatsReq->subscriptionId = subscriptionId;
- for(actionIdx = 0; actionIdx < ricSubscriptionInfo->numOfActions; actionIdx++)
+ for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
{
if(ricSubscriptionInfo->actionSequence[actionIdx].action == CONFIG_ADD)
{
actionDb = &ricSubscriptionInfo->actionSequence[actionIdx];
- macStatsReq->statsGrpList[grpIdx].groupId = actionDb->id;
+ macStatsReq->statsGrpList[grpIdx].groupId = actionDb->actionId;
switch(actionDb->definition.formatType)
{
case 1:
}
default:
{
- DU_LOG("\nERROR --> DU_APP : Invalid measurement name");
+ DU_LOG("\nERROR --> E2AP : Invalid measurement name");
break;
}
}
}
default:
{
- DU_LOG("\nERROR --> DU_APP : BuildAndSendStatsReqToMac: Only Action Definition Format 1 supported");
+ DU_LOG("\nERROR --> E2AP : fillRicSubsInMacStatsReq: Only Action Definition Format 1 supported");
break;
}
}
/* Delete subcription from RAN Function */
memcpy(&requestId, &((RicSubscription *)ricSubscriptionNode->node)->requestId, sizeof(RicRequestId));
cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubscriptionNode);
- DU_FREE(ricSubscriptionNode->node, sizeof(RicSubscription));
- DU_FREE(ricSubscriptionNode, sizeof(CmLList));
-
+ deleteRicSubscriptionNode(ricSubscriptionNode);
+ ricSubscriptionNode = NULLP;
convertDuCauseToE2Cause(statsRsp->statsGrpRejectedList[0].cause, &failureCause);
/* Send RIC subscription failure to RIC */
* reporting period timer for this subscription request
* from RIC
*
- * @params[in]
+ * @params[in] Statistics response received from MAC
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-void e2ProcStatsRsp(MacStatsRsp *statsRsp)
+uint8_t e2ProcStatsRsp(MacStatsRsp *statsRsp)
{
uint8_t idx = 0;
uint8_t actionId = 0;
+ uint32_t reportingPeriod = 0;
RanFunction *ranFuncDb = NULLP;
CmLList *ricSubscriptionNode = NULLP;
RicSubscription *ricSubscriptionInfo = NULLP;
/* Fetch RAN Function and Subscription DB using subscription Id received in statistics response */
if(fetchSubsInfoFromSubsId(statsRsp->subscriptionId, &ranFuncDb, &ricSubscriptionNode, &ricSubscriptionInfo) != ROK)
{
- DU_LOG("\nERROR --> DU_APP : DuProcMacStatsRsp: Failed to fetch subscriprtion details");
- return;
+ DU_LOG("\nERROR --> E2AP : DuProcMacStatsRsp: Failed to fetch subscriprtion details");
+ return RFAILED;
}
/* Fetch pre-stored statistics response info by DU APP */
}
else
{
+ /* Once RIC subscription is successful, mark the config action as unknown */
+ ricSubscriptionInfo->action = CONFIG_UNKNOWN;
+
+ /* Start RIC Subscription reporting timer */
+ switch(ricSubscriptionInfo->eventTriggerDefinition.formatType)
+ {
+ case 1:
+ {
+ reportingPeriod = ricSubscriptionInfo->eventTriggerDefinition.choice.format1.reportingPeriod;
+
+ /* Save the start time of reporting period */
+ storeReportStartTime(&ricSubscriptionInfo->eventTriggerDefinition.choice.format1.startTime);
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> E2AP : Invalid event trigger format of RIC subscription");
+ return RFAILED;
+ }
+ }
+ if(duChkTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR) != true)
+ {
+ duStartTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR, reportingPeriod);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> E2AP : RIC Subscription reporting timer already running for RIC Subscription");
+ return RFAILED;
+ }
+
+
/* If even 1 action is accepted :
*
* For accepted groups:
for(idx=0; idx<statsRsp->numGrpRejected; idx++)
{
actionId = statsRsp->statsGrpRejectedList[idx].groupId;
- if(ricSubscriptionInfo->actionSequence[actionId-1].id == actionId)
+ if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
{
- memset(&ricSubscriptionInfo->actionSequence[actionId-1], 0, sizeof(ActionInfo));
+ memset(&ricSubscriptionInfo->actionSequence[actionId], 0, sizeof(ActionInfo));
ricSubscriptionInfo->numOfActions--;
pendingSubsRsp->rejectedActionList[pendingSubsRsp->numOfRejectedActions].id = actionId;
BuildAndSendRicSubscriptionRsp(pendingSubsRsp);
}
memset(pendingSubsRsp, 0, sizeof(PendingSubsRspInfo));
+ return ROK;
}
/*******************************************************************
* action
*
* @params[in] Statistics Indication message received from MAC
- * @return void
+ * @return ROK-success
+ * RFAILED-failure
*
* ****************************************************************/
-void e2ProcStatsInd(MacStatsInd *statsInd)
+uint8_t e2ProcStatsInd(MacStatsInd *statsInd)
{
+ uint8_t statsIdx = 0;
RanFunction *ranFuncDb = NULLP;
CmLList *ricSubscriptionNode = NULLP;
RicSubscription *ricSubscriptionInfo = NULLP;
+ ActionInfo *actionInfo = NULLP;
+ ActionDefFormat1 *actionFormat = NULLP;
+ char e2MeasTypeName[STRING_SIZE_150_BYTES] = "";
+ MeasurementInfo *measInfo = NULLP;
+ CmLList *measInfoNode = NULLP;
+ double *measValue = NULLP;
+ CmLList *measValueNode = NULLP;
/* TODO : When stats indication is received
* DU APP searches for the message type in E2AP RIC subscription
* in statistics response */
if(fetchSubsInfoFromSubsId(statsInd->subscriptionId, &ranFuncDb, &ricSubscriptionNode, &ricSubscriptionInfo) != ROK)
{
- DU_LOG("\nERROR --> DU_APP : extractStatsMeasurement: Failed to fetch subscriprtion details");
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Failed to fetch subscriprtion details");
+ return RFAILED;
+ }
+
+ /* Fetch RIC subscription's action DB */
+ actionInfo = fetchActionInfoFromActionId(statsInd->groupId, ricSubscriptionInfo);
+ if(actionInfo == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Failed to fetch action ID [%d]", statsInd->groupId);
+ return RFAILED;
+ }
+
+ /* Check Action format */
+ switch(actionInfo->definition.formatType)
+ {
+ case 1:
+ {
+ actionFormat = &actionInfo->definition.choice.format1;
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Action Format [%d] is not supported", \
+ actionInfo->definition.formatType);
+ return RFAILED;
+ }
+ }
+
+ /* Fetch each Measurement info from action info and store its reported value in DB */
+ for(statsIdx = 0; statsIdx < statsInd->numStats; statsIdx++)
+ {
+ memset(e2MeasTypeName, 0, STRING_SIZE_150_BYTES);
+ measInfo = NULLP;
+ measInfoNode = NULLP;
+
+ /* Convert Measurement type from MAC-supported format to E2-supported format */
+ if(convertMacMeasTypeToE2MeasType(statsInd->measuredStatsList[statsIdx].type, e2MeasTypeName) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Failed to convert measurement type from MAC-supported\
+ MAC-supported format to E2-supported format");
+ continue;
+ }
+
+ /* Fetch Measurement Info using E2-supported measurement type name */
+ measInfo = fetchMeasInfoFromMeasTypeName(e2MeasTypeName, &actionFormat->measurementInfoList, &measInfoNode);
+ if(measInfo == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Measurement Type Name [%s] not found", e2MeasTypeName);
+ continue;
+ }
+
+ /* Store the measurement value in the measurement info DB fetched */
+ DU_ALLOC(measValue, sizeof(double));
+ if(!measValue)
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Memory allocation failed at line [%d]", __LINE__);
+ return RFAILED;
+ }
+ *measValue = statsInd->measuredStatsList[statsIdx].value;
+
+ DU_ALLOC(measValueNode, sizeof(CmLList));
+ if(!measValueNode)
+ {
+ DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Memory allocation failed at line [%d]", __LINE__);
+ DU_FREE(measValue, sizeof(double));
+ return RFAILED;
+ }
+ measValueNode->node = (PTR) measValue;
+ cmLListAdd2Tail(&measInfo->measuredValue, measValueNode);
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle RIC Subscription reporting timer expry
+ *
+ * @details
+ *
+ * Function : E2apHdlRicSubsReportTmrExp
+ *
+ * Functionality: On expiry of RIC subscription reporting
+ * timer expiry, RIC indication is sent for all actions
+ * in RIC subscription
+ *
+ * @params[in] RIC subscription DB
+ * @return void
+ *
+ * ****************************************************************/
+void E2apHdlRicSubsReportTmrExp(RicSubscription *ricSubscription)
+{
+ uint8_t actionIdx = 0;
+ uint32_t reportingPeriod = 0;
+
+ for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
+ {
+ if(ricSubscription->actionSequence[actionIdx].actionId >= 0)
+ {
+ BuildAndSendRicIndication(ricSubscription, &ricSubscription->actionSequence[actionIdx]);
+ }
+ }
+
+ /* Start RIC Subscription reporting timer again */
+ switch(ricSubscription->eventTriggerDefinition.formatType)
+ {
+ case 1:
+ {
+ reportingPeriod = ricSubscription->eventTriggerDefinition.choice.format1.reportingPeriod;
+ /* Save the start time of reporting period */
+ storeReportStartTime(&ricSubscription->eventTriggerDefinition.choice.format1.startTime);
+ break;
+ }
+ default:
+ return;
+ }
+ if(duChkTmr((PTR)ricSubscription, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR) != true)
+ {
+ duStartTmr((PTR)ricSubscription, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR, reportingPeriod);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> E2AP : Failed in %s at line %d", __func__, __LINE__);
return;
}
}
*
* @params[in]
* Type of interface
- * Component action type
+ * Component Id
* Pointer to E2 component node to be searched
* @return CmLList
*
* ****************************************************************/
-E2NodeComponent *fetchE2NodeComponentInfo(InterfaceType interfaceType, uint8_t componentActionType, CmLList **e2ComponentNode)
+E2NodeComponent *fetchE2NodeComponentInfo(InterfaceType interfaceType, uint64_t componentId, CmLList **e2ComponentNode)
{
E2NodeComponent *e2NodeComponentInfo=NULLP;
while(*e2ComponentNode)
{
e2NodeComponentInfo = (E2NodeComponent*)((*e2ComponentNode)->node);
- if((e2NodeComponentInfo->interfaceType == interfaceType) && (e2NodeComponentInfo->componentActionType == componentActionType))
+ if((e2NodeComponentInfo->interfaceType == interfaceType) && (e2NodeComponentInfo->componentId == componentId))
{
-
break;
}
/*******************************************************************
*
- * @brief add or modify E2NodeComponent list
+ * @brief fill E2 node component rsp info
+ *
+ * @details
+ *
+ * Function : fillE2NodeComponentRspInfo
+ *
+ * Functionality: fill E2 Node Component rsp info
+ *
+ * @parameter
+ * Type of interface
+ * Component action type
+ * Size of buffer which needs to be store
+ * buffer string which needs to be store
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t fillE2NodeComponentRspInfo(InterfaceType interfaceType, uint64_t componentId, uint8_t action, uint8_t bufSize, char *bufString)
+{
+ E2NodeConfig *configInfo=NULLP;
+ E2NodeComponent *e2NodeComponentInfo= NULLP;
+ CmLList *node = NULLP;
+
+ e2NodeComponentInfo = fetchE2NodeComponentInfo(interfaceType, componentId, &node);
+ if(!e2NodeComponentInfo)
+ {
+ DU_LOG("\nERROR --> E2AP : Unable to find the node");
+ return RFAILED;
+ }
+
+ switch(action)
+ {
+ case E2_NODE_COMPONENT_ADD:
+ {
+ configInfo = e2NodeComponentInfo->addConfiguration;
+ break;
+ }
+ case E2_NODE_COMPONENT_UPDATE:
+ {
+ configInfo = e2NodeComponentInfo->updateConfiguration;
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> E2AP : Invalid action %d received",action);
+ return RFAILED;
+ }
+ }
+
+ if(configInfo->componentRequestPart== NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : E2 node Component request part is not present");
+ return RFAILED;
+ }
+
+ configInfo->rspBufSize = bufSize;
+ DU_ALLOC(configInfo->componentResponsePart, bufSize);
+ if(configInfo->componentResponsePart == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed to store the encoding of rsp");
+ return RFAILED;
+ }
+ memcpy(configInfo->componentResponsePart, bufString, configInfo->rspBufSize);
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief add E2 node component req info
*
* @details
*
- * Function : addOrModifyE2NodeComponent
+ * Function : addE2NodeComponent
*
- * Functionality: add or modify E2NodeComponent list
+ * Functionality: add E2 node component req info
*
* @parameter
* Type of interface
* Component action type
- * boolean variable to check req or rsp msg type
* Size of buffer which needs to be store
* buffer string which needs to be store
* @return ROK - success
*
******************************************************************/
-uint8_t addOrModifyE2NodeComponent(InterfaceType interfaceType, uint8_t action, bool reqPart, uint8_t bufSize, char *bufString)
+uint8_t addE2NodeComponent(InterfaceType interfaceType, uint64_t componentId, uint8_t bufSize, char *bufString)
+{
+ E2NodeComponent *e2NodeComponentInfo= NULLP;
+ CmLList *node = NULLP;
+
+ DU_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent));
+ if(!e2NodeComponentInfo)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ return RFAILED;
+ }
+ e2NodeComponentInfo->interfaceType =interfaceType;
+ e2NodeComponentInfo->componentId=componentId;
+
+ DU_ALLOC(e2NodeComponentInfo->addConfiguration, sizeof(E2NodeConfig));
+ if(!e2NodeComponentInfo->addConfiguration)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ return RFAILED;
+ }
+
+ e2NodeComponentInfo->addConfiguration->reqBufSize = bufSize;
+
+ DU_ALLOC(e2NodeComponentInfo->addConfiguration->componentRequestPart, bufSize);
+ if(e2NodeComponentInfo->addConfiguration->componentRequestPart == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
+ return RFAILED;
+ }
+ memcpy(e2NodeComponentInfo->addConfiguration->componentRequestPart, bufString,\
+ e2NodeComponentInfo->addConfiguration->reqBufSize);
+
+ DU_ALLOC(node, sizeof(CmLList));
+ if(node)
+ {
+ node->node = (PTR) e2NodeComponentInfo;
+ cmLListAdd2Tail(&duCb.e2apDb.e2NodeComponentList, node);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ DU_FREE(e2NodeComponentInfo->addConfiguration->componentRequestPart, bufSize);
+ DU_FREE(e2NodeComponentInfo->addConfiguration, sizeof(E2NodeConfig));
+ DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
+ return RFAILED;
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief update E2 node component req info
+ *
+ * @details
+ *
+ * Function : updateE2NodeComponent
+ *
+ * Functionality: update E2 node component req info
+ *
+ * @parameter
+ * Type of interface
+ * Size of buffer which needs to be store
+ * buffer string which needs to be store
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ******************************************************************/
+
+uint8_t updateE2NodeComponent(InterfaceType interfaceType, uint64_t componentId, uint8_t bufSize, char *bufString)
+{
+ E2NodeComponent *e2NodeComponentInfo= NULLP;
+ CmLList *node = NULLP;
+
+ e2NodeComponentInfo = fetchE2NodeComponentInfo(interfaceType, componentId, &node);
+ if(!e2NodeComponentInfo)
+ {
+ DU_LOG("\nERROR --> E2AP : Received null information in %s",__func__);
+ return RFAILED;
+ }
+
+ DU_ALLOC(e2NodeComponentInfo->updateConfiguration, sizeof(E2NodeConfig));
+ if(!e2NodeComponentInfo->updateConfiguration)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ return RFAILED;
+ }
+
+ e2NodeComponentInfo->updateConfiguration->reqBufSize = bufSize;
+
+ DU_ALLOC(e2NodeComponentInfo->updateConfiguration->componentRequestPart, bufSize);
+ if(e2NodeComponentInfo->updateConfiguration->componentRequestPart == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
+ DU_FREE(e2NodeComponentInfo->updateConfiguration, sizeof(E2NodeConfig));
+ return RFAILED;
+ }
+
+ memcpy(e2NodeComponentInfo->updateConfiguration->componentRequestPart, bufString,\
+ e2NodeComponentInfo->updateConfiguration->reqBufSize);
+ return ROK;
+
+}
+
+/*******************************************************************
+ *
+ * @brief delete E2 node component req info
+ *
+ * @details
+ *
+ * Function : deleteE2NodeComponent
+ *
+ * Functionality: delete E2 node component req info
+ *
+ * @parameter
+ * Type of interface
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ******************************************************************/
+
+uint8_t deleteE2NodeComponent(InterfaceType interfaceType, uint64_t componentId)
{
- E2NodeComponent *e2NodeComponentInfo= NULL;
+ E2NodeComponent *e2NodeComponentInfo= NULLP;
CmLList *node = NULLP;
+
+ e2NodeComponentInfo = fetchE2NodeComponentInfo(interfaceType, componentId, &node);
+ if(!e2NodeComponentInfo)
+ {
+ DU_LOG("\nERROR --> E2AP : Received null information in %s",__func__);
+ return RFAILED;
+ }
+
+ e2NodeComponentInfo->deleteConfiguration = true;
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief fill E2 node component req info
+ *
+ * @details
+ *
+ * Function : fillE2NodeComponentReqInfo
+ *
+ * Functionality: fill E2 node component req info
+ *
+ * @parameter
+ * Type of interface
+ * Component action type
+ * Size of buffer which needs to be store
+ * buffer string which needs to be store
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ******************************************************************/
+
+uint8_t fillE2NodeComponentReqInfo(InterfaceType interfaceType, uint64_t componentId, uint8_t action, uint8_t bufSize, char *bufString)
+{
+ switch(action)
+ {
+ case E2_NODE_COMPONENT_ADD:
+ {
+ if(addE2NodeComponent(interfaceType, componentId, bufSize, bufString) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : Failed to add e2 node component");
+ return RFAILED;
+ }
+ break;
+ }
+ case E2_NODE_COMPONENT_UPDATE:
+ {
+ if(updateE2NodeComponent(interfaceType, componentId, bufSize, bufString) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : Failed to update e2 node component");
+ return RFAILED;
+ }
+ break;
+ }
+ case E2_NODE_COMPONENT_DEL:
+ {
+ if(deleteE2NodeComponent(interfaceType, componentId) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : Failed to delete e2 node component");
+ return RFAILED;
+ }
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> E2AP : Invalid action %d received",action);
+ return RFAILED;
+ }
+ }
+
+ return ROK;
+}
+
+/******************************************************************
+ *
+ * @brief Delete measured Value list
+ *
+ * @details
+ *
+ * Function : deleteMeasuredValueList
+ *
+ * Functionality: Delete measured Value list
+ *
+ * @params[in] List of measured Value
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void deleteMeasuredValueList(CmLListCp *measuredValueList)
+{
+ CmLList *measValNode = NULLP;
+
+ CM_LLIST_FIRST_NODE(measuredValueList, measValNode);
+
+ while(measValNode)
+ {
+ cmLListDelFrm(measuredValueList, measValNode);
+ DU_FREE(measValNode->node, sizeof(double));
+ DU_FREE(measValNode, sizeof(CmLList));
+ CM_LLIST_FIRST_NODE(measuredValueList, measValNode);
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Delete Measurement Info List
+ *
+ * @details
+ *
+ * Function : deleteMeasurementInfoList
+ *
+ * Functionality: Delete Measurement Info List
+ *
+ * @params[in] List of Measurement Info List
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void deleteMeasurementInfoList(CmLListCp *measInfoList)
+{
+ CmLList *measInfoNode = NULLP;
+ MeasurementInfo *measInfo = NULLP;
+
+ CM_LLIST_FIRST_NODE(measInfoList, measInfoNode);
+ while(measInfoNode)
+ {
+ measInfo = (MeasurementInfo *)measInfoNode->node;
+ cmLListDelFrm(measInfoList, measInfoNode);
+ deleteMeasuredValueList(&measInfo->measuredValue);
+ DU_FREE(measInfo, sizeof(MeasurementInfo));
+ DU_FREE(measInfoNode, sizeof(CmLList));
+ CM_LLIST_FIRST_NODE(measInfoList, measInfoNode);
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Delete Ric subscription action
+ *
+ * @details
+ *
+ * Function : deleteActionSequence
+ *
+ * Functionality: Delete Ric subscription action
+ *
+ * @params[in] Action info
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void deleteActionSequence(ActionInfo *action)
+{
+ ActionDefinition *definition=NULLP;
+ definition= &action->definition;
- if(reqPart == true)
+ switch(definition->formatType)
{
- DU_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent));
- if(!e2NodeComponentInfo)
+ case 1:
+ {
+ deleteMeasurementInfoList(&definition->choice.format1.measurementInfoList);
+ break;
+ }
+
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ default:
{
- DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentInfo in %s",__func__);
- return RFAILED;
+ DU_LOG("\nERROR --> E2AP : Format %d does not supported", definition->formatType);
+ break;
+ }
+ }
+ memset(action, 0, sizeof(ActionInfo));
+ action->actionId = -1;
+}
+
+/******************************************************************
+ *
+ * @brief Delete Ric subscription node
+ *
+ * @details
+ *
+ * Function : deleteRicSubscriptionNode
+ *
+ * Functionality: Delete Ric subscription node
+ *
+ * @params[in] Ric subscription info
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void deleteRicSubscriptionNode(CmLList *subscriptionNode)
+{
+ uint8_t actionIdx=0;
+ RicSubscription *ricSubscriptionInfo = NULLP;
+
+ ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node;
+
+ for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
+ {
+ if(ricSubscriptionInfo->actionSequence[actionIdx].actionId > -1)
+ {
+ deleteActionSequence(&ricSubscriptionInfo->actionSequence[actionIdx]);
}
- e2NodeComponentInfo->interfaceType =interfaceType;
- e2NodeComponentInfo->componentId=duCfgParam.duId;
- e2NodeComponentInfo->componentActionType = action;
- e2NodeComponentInfo->reqBufSize = bufSize;
+ }
+
+ if(duChkTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR) == TRUE)
+ {
+ duStopTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR);
+ }
+
+ memset(ricSubscriptionInfo, 0, sizeof(RicSubscription));
+ DU_FREE(subscriptionNode->node, sizeof(RicSubscription));
+ DU_FREE(subscriptionNode, sizeof(CmLList));
+}
+
+/******************************************************************
+ *
+ * @brief Delete ric subscription list from the database
+ *
+ * @details
+ *
+ * Function : deleteRicSubscriptionList
+ *
+ * Functionality: Delete ric subscription list
+ *
+ * @params[in]
+ * Subscription List to be deleted
+
+ * @return void
+ *
+ * ****************************************************************/
+void deleteRicSubscriptionList(CmLListCp *subscriptionList)
+{
+ CmLList *subscriptionNode=NULLP;
+
+ CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
+ while(subscriptionNode)
+ {
+ /* TODO - Remove subscription information from MAC and SCH as well */
+ cmLListDelFrm(subscriptionList, subscriptionNode);
+ deleteRicSubscriptionNode(subscriptionNode);
+ CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Find all RIC subscriptions to be deleted in all RAN
+ * Functions
+ *
+ * @details
+ *
+ * Function : fetchRicSubsToBeDeleted
+ *
+ * Functionality: Find all RIC subscriptions to be deleted in all
+ * RAN functions and store in a temporary list
+ *
+ * @parameter Temporary list to store subscriptions to be deleted
+ * @return void
+ *
+ ******************************************************************/
+void fetchRicSubsToBeDeleted(CmLListCp *ricSubsToBeDelList)
+{
+ uint16_t ranFuncIdx = 0;
+ CmLList *subsNode = NULLP;
+ CmLList *subsToDelNode = NULLP;
- DU_ALLOC(e2NodeComponentInfo->componentRequestPart, bufSize);
- if(e2NodeComponentInfo->componentRequestPart == NULLP)
+ for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
+ {
+ if(duCb.e2apDb.ranFunction[ranFuncIdx].id > 0)
{
- DU_LOG("\nERROR --> E2AP : Memory allocation failed for componentRequestPart");
- DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
- return RFAILED;
+ CM_LLIST_FIRST_NODE(&duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList, subsNode);
+ while(subsNode)
+ {
+ if(((RicSubscription *)subsNode->node)->action == CONFIG_DEL)
+ {
+ DU_ALLOC(subsToDelNode, sizeof(CmLList));
+ if(!subsToDelNode)
+ {
+ DU_LOG("\nERROR --> E2AP : %s: Memory allocation failure at %d", __func__, __LINE__);
+ return;
+ }
+ subsToDelNode->node = subsNode->node;
+ cmLListAdd2Tail(ricSubsToBeDelList, subsToDelNode);
+ }
+ subsToDelNode = NULLP;
+ subsNode = subsNode->next;
+ }
+ }
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Delete e2 node information from the database
+ *
+ * @details
+ *
+ * Function : removeE2NodeInformation
+ *
+ * Functionality: Delete e2 node information from the database
+ *
+ * @params[in]
+ *
+ * @return void
+ *
+******************************************************************/
+void removeE2NodeInformation()
+{
+ uint16_t ranFuncIdx = 0;
+
+ DU_LOG("\nINFO --> E2AP : Deleting all the E2 node configuration");
+ for(ranFuncIdx=0; ranFuncIdx<MAX_RAN_FUNCTION; ranFuncIdx++)
+ {
+ if(duCb.e2apDb.ranFunction[ranFuncIdx].id >0)
+ {
+ deleteRicSubscriptionList(&(duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList));
+ memset(&(duCb.e2apDb.ranFunction[ranFuncIdx].pendingSubsRspInfo), 0, MAX_PENDING_SUBSCRIPTION_RSP*sizeof(PendingSubsRspInfo));
}
- memcpy(e2NodeComponentInfo->componentRequestPart, bufString, e2NodeComponentInfo->reqBufSize);
- DU_ALLOC(node, sizeof(CmLList));
- if(node)
+ }
+ memset(&duCb.e2apDb.ricId, 0, sizeof(GlobalRicId));
+ duCb.e2apDb.numOfTNLAssoc = 0;
+ memset(&duCb.e2apDb.tnlAssoc, 0, MAX_TNL_ASSOCIATION*sizeof(TNLAssociation));
+ memset(&ricParams, 0, sizeof(DuSctpDestCb));
+}
+
+/*******************************************************************
+ *
+ * @brief Extract statistics received from DU layers and delete
+ * Ric subscription info
+ *
+ * @details
+ *
+ * Function :e2ProcStatsDeleteRsp
+ *
+ * Functionality: Extract statistics received from DU layers
+ * and delete ric subscription iformation form db
+ *
+ * @params[in] Statistics delete rsp from MAC
+ * @return ROK-success
+ * RFAILED-failure
+ *
+ * ****************************************************************/
+uint8_t e2ProcStatsDeleteRsp(MacStatsDeleteRsp *statsDeleteRsp)
+{
+ RanFunction *ranFuncDb = NULLP;
+ CmLList *ricSubscriptionNode = NULLP;
+ RicSubscription *ricSubscriptionInfo = NULLP;
+ E2FailureCause failureCause;
+
+ /* Fetch RAN Function and Subscription DB using subscription Id received
+ * in statistics delete response */
+ if(fetchSubsInfoFromSubsId(statsDeleteRsp->subscriptionId, &ranFuncDb, &ricSubscriptionNode, &ricSubscriptionInfo) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : e2ProcStatsDeleteRsp: Failed to fetch subscriprtion details");
+ return RFAILED;
+ }
+
+ deleteRicSubscriptionNode(ricSubscriptionNode);
+
+ if(statsDeleteRsp->result == MAC_DU_APP_RSP_NOK)
+ {
+ if(statsDeleteRsp->status == STATS_ID_NOT_FOUND)
{
- node->node = (PTR) e2NodeComponentInfo;
- cmLListAdd2Tail(&duCb.e2apDb.e2NodeComponentList, node);
+ failureCause.causeType =E2_RIC_REQUEST;
+ failureCause.cause = E2_REQUEST_INFORMATION_UNAVAILABLE;
}
else
{
- DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentList node");
- DU_FREE(e2NodeComponentInfo->componentRequestPart, bufSize);
- DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
+ failureCause.causeType = E2_MISCELLANEOUS;
+ failureCause.cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
+ }
+
+ if(BuildAndSendRicSubscriptionDeleteFailure(ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId, failureCause) != ROK)
+ {
+ DU_LOG("\nERROR --> E2AP : e2ProcStatsDeleteRsp: failed to build and send ric subs delete failure");
return RFAILED;
}
}
else
{
- if(duCb.e2apDb.e2NodeComponentList.count)
- {
- e2NodeComponentInfo = fetchE2NodeComponentInfo(interfaceType, action, &node);
- if(e2NodeComponentInfo->componentRequestPart== NULLP)
- {
- DU_LOG("\nERROR --> E2AP : E2 node Component request part is not present");
- return RFAILED;
- }
-
- e2NodeComponentInfo->rspBufSize = bufSize;
- DU_ALLOC(e2NodeComponentInfo->componentResponsePart, bufSize);
- if(e2NodeComponentInfo->componentResponsePart == NULLP)
- {
- DU_LOG("\nERROR --> E2AP : Memory allocation failed to store the encoding of rsp");
- return RFAILED;
- }
- memcpy(e2NodeComponentInfo->componentResponsePart, bufString, e2NodeComponentInfo->rspBufSize);
- return ROK;
- }
- else
+ if(BuildAndSendRicSubscriptionDeleteResponse(ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId) != ROK)
{
- DU_LOG("\nERROR --> E2AP : Unable to find the node");
+ DU_LOG("\nERROR --> E2AP : e2ProcStatsDeleteRsp: failed to build and send ric subs delete rsp");
return RFAILED;
}
- }
+ }
+
return ROK;
}