X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_e2ap_mgr.c;h=ed0d8187c703dee0f1b06bb311d2c7a1c622a535;hb=6dc8a4c17da24847b3a3aee91b37151f77a8a5bc;hp=e5816feb3c45f8b4d6be17a6cd0231cbb53f8955;hpb=a3796bdbd76c38cd78ed1c9ef5cbf4cee1c355de;p=o-du%2Fl2.git diff --git a/src/du_app/du_e2ap_mgr.c b/src/du_app/du_e2ap_mgr.c index e5816feb3..ed0d8187c 100644 --- a/src/du_app/du_e2ap_mgr.c +++ b/src/du_app/du_e2ap_mgr.c @@ -574,9 +574,8 @@ uint8_t rejectAllStatsGroup(RanFunction *ranFuncDb, CmLList *ricSubscriptionNode /* 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 */ @@ -641,6 +640,9 @@ uint8_t e2ProcStatsRsp(MacStatsRsp *statsRsp) } 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) { @@ -894,13 +896,13 @@ void E2apHdlRicSubsReportTmrExp(RicSubscription *ricSubscription) * * @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; @@ -910,9 +912,8 @@ E2NodeComponent *fetchE2NodeComponentInfo(InterfaceType interfaceType, uint8_t c while(*e2ComponentNode) { e2NodeComponentInfo = (E2NodeComponent*)((*e2ComponentNode)->node); - if((e2NodeComponentInfo->interfaceType == interfaceType) && (e2NodeComponentInfo->componentActionType == componentActionType)) + if((e2NodeComponentInfo->interfaceType == interfaceType) && (e2NodeComponentInfo->componentId == componentId)) { - break; } @@ -925,18 +926,86 @@ E2NodeComponent *fetchE2NodeComponentInfo(InterfaceType interfaceType, uint8_t c /******************************************************************* * - * @brief add or modify E2NodeComponent list + * @brief fill E2 node component rsp info * * @details * - * Function : addOrModifyE2NodeComponent + * Function : fillE2NodeComponentRspInfo * - * Functionality: add or modify E2NodeComponent list + * 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 : addE2NodeComponent + * + * 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 @@ -944,73 +1013,505 @@ E2NodeComponent *fetchE2NodeComponentInfo(InterfaceType interfaceType, uint8_t c * ******************************************************************/ -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= NULL; + E2NodeComponent *e2NodeComponentInfo= NULLP; CmLList *node = NULLP; - if(reqPart == true) + DU_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent)); + if(!e2NodeComponentInfo) { - DU_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent)); - if(!e2NodeComponentInfo) - { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentInfo in %s",__func__); - return RFAILED; - } - e2NodeComponentInfo->interfaceType =interfaceType; - e2NodeComponentInfo->componentId=duCfgParam.duId; - e2NodeComponentInfo->componentActionType = action; - e2NodeComponentInfo->reqBufSize = bufSize; + DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__); + return RFAILED; + } + e2NodeComponentInfo->interfaceType =interfaceType; + e2NodeComponentInfo->componentId=componentId; - DU_ALLOC(e2NodeComponentInfo->componentRequestPart, bufSize); - if(e2NodeComponentInfo->componentRequestPart == NULLP) - { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for componentRequestPart"); - DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent)); - return RFAILED; - } - memcpy(e2NodeComponentInfo->componentRequestPart, bufString, e2NodeComponentInfo->reqBufSize); - DU_ALLOC(node, sizeof(CmLList)); - if(node) + 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= 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; + + switch(definition->formatType) + { + case 1: + { + deleteMeasurementInfoList(&definition->choice.format1.measurementInfoList); + break; + } + + case 2: + case 3: + case 4: + case 5: + default: { - node->node = (PTR) e2NodeComponentInfo; - cmLListAdd2Tail(&duCb.e2apDb.e2NodeComponentList, node); + DU_LOG("\nERROR --> E2AP : Format %d does not supported", definition->formatType); + break; } - else + } + 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) { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentList node"); - DU_FREE(e2NodeComponentInfo->componentRequestPart, bufSize); - DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent)); - return RFAILED; + deleteActionSequence(&ricSubscriptionInfo->actionSequence[actionIdx]); } } - else + + if(duChkTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR) == TRUE) { - if(duCb.e2apDb.e2NodeComponentList.count) + 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; + + for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++) + { + if(duCb.e2apDb.ranFunction[ranFuncIdx].id > 0) { - e2NodeComponentInfo = fetchE2NodeComponentInfo(interfaceType, action, &node); - if(e2NodeComponentInfo->componentRequestPart== NULLP) + CM_LLIST_FIRST_NODE(&duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList, subsNode); + while(subsNode) { - 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; + 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; } - memcpy(e2NodeComponentInfo->componentResponsePart, bufString, e2NodeComponentInfo->rspBufSize); - return ROK; } - else + } +} + +/****************************************************************** + * + * @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; ranFuncIdx0) { - DU_LOG("\nERROR --> E2AP : Unable to find the node"); - return RFAILED; + deleteRicSubscriptionList(&(duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList)); + memset(&(duCb.e2apDb.ranFunction[ranFuncIdx].pendingSubsRspInfo), 0, MAX_PENDING_SUBSCRIPTION_RSP*sizeof(PendingSubsRspInfo)); } - } + } + 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 : extractStatsMeasurement: Failed to fetch subscriprtion details"); + return RFAILED; + } + + deleteRicSubscriptionNode(ricSubscriptionNode); +#if 0 + /* TODO */ + if(statsDeleteRsp->result == MAC_DU_APP_RSP_NOK && statsDeleteRsp->status == STATS_ID_NOT_FOUND) + { + failureCause->causeType =E2_RIC_REQUEST; + failureCause->cause = E2_REQUEST_INFORMATION_UNAVAILABLE; + BuildAndSendRicSubscriptionDeleteFailure(ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId, failureCause); + } + else + { + BuildAndSendRicSubscriptionDeleteResponse(ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId); + } +#endif return ROK; }