From: pborla Date: Thu, 23 Nov 2023 08:46:07 +0000 (+0530) Subject: [Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] Changes in RIC Subscription action structure X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=c8f87915d06efa94e5109e7ea8e7683f02f3aba2;p=o-du%2Fl2.git [Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] Changes in RIC Subscription action structure Change-Id: I9479eb94159379942e011872d21e398ffb88174c Signed-off-by: pborla --- diff --git a/src/du_app/du_e2ap_mgr.c b/src/du_app/du_e2ap_mgr.c index eabc0d6b2..c104722e4 100644 --- a/src/du_app/du_e2ap_mgr.c +++ b/src/du_app/du_e2ap_mgr.c @@ -201,22 +201,32 @@ MeasurementInfo *fetchMeasInfoFromMeasTypeName(char *e2MeasTypeName, CmLListCp * * * @params[in] Action ID * RIC Subscription DB + * Ric Action Node * @return Action Info DB * NULL, in case of failure * * ****************************************************************/ -ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo) +ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo, CmLList ** actionNode) { ActionInfo *actionInfoDb = NULLP; - if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId) + + CM_LLIST_FIRST_NODE(&ricSubscriptionInfo->actionSequence, *actionNode); + while(*actionNode) { - actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId]; + actionInfoDb = (ActionInfo*)((*actionNode)->node); + if(actionInfoDb && actionInfoDb->actionId == actionId) + { + break; + } + *actionNode= (*actionNode)->next; + actionInfoDb = NULLP; } - else + + if(!actionInfoDb) { 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); + subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\ + ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId); } return actionInfoDb; @@ -474,17 +484,19 @@ uint8_t fillRicSubsInMacStatsReq(MacStatsReq *macStatsReq, RicSubscription* ricS uint8_t actionIdx = 0, grpIdx = 0, statsIdx = 0; uint64_t subscriptionId = 0; ActionInfo *actionDb = NULLP; + CmLList *actionNode = NULLP; ActionDefFormat1 *format1Action = NULLP; /* Generate subscription ID using RIC Request ID and RAN Function ID */ encodeSubscriptionId(&subscriptionId, ricSubscriptionInfo->ranFuncId, ricSubscriptionInfo->requestId); macStatsReq->subscriptionId = subscriptionId; - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) + CM_LLIST_FIRST_NODE(&ricSubscriptionInfo->actionSequence, actionNode); + while(actionNode) { - if(ricSubscriptionInfo->actionSequence[actionIdx].action == CONFIG_ADD) + actionDb = (ActionInfo*)(actionNode->node); + if(actionDb->action == CONFIG_ADD) { - actionDb = &ricSubscriptionInfo->actionSequence[actionIdx]; macStatsReq->statsGrpList[grpIdx].groupId = actionDb->actionId; switch(actionDb->definition.formatType) { @@ -533,6 +545,7 @@ uint8_t fillRicSubsInMacStatsReq(MacStatsReq *macStatsReq, RicSubscription* ricS if(macStatsReq->statsGrpList[grpIdx].numStats) grpIdx++; } + actionNode = actionNode->next; } macStatsReq->numStatsGroup = grpIdx; @@ -609,6 +622,7 @@ uint8_t e2ProcStatsRsp(MacStatsRsp *statsRsp) uint32_t reportingPeriod = 0; RanFunction *ranFuncDb = NULLP; CmLList *ricSubscriptionNode = NULLP; + CmLList *actionNode = NULLP; RicSubscription *ricSubscriptionInfo = NULLP; ActionInfo *actionInfoDb = NULLP; PendingSubsRspInfo *pendingSubsRsp = NULLP; @@ -682,7 +696,7 @@ uint8_t e2ProcStatsRsp(MacStatsRsp *statsRsp) actionInfoDb = NULLP; actionId = statsRsp->statsGrpAcceptedList[idx]; - actionInfoDb = fetchActionInfoFromActionId(actionId, ricSubscriptionInfo); + actionInfoDb = fetchActionInfoFromActionId(actionId, ricSubscriptionInfo, &actionNode); if(actionInfoDb && (actionInfoDb->action == CONFIG_ADD)) { actionInfoDb->action = CONFIG_UNKNOWN; @@ -696,12 +710,12 @@ uint8_t e2ProcStatsRsp(MacStatsRsp *statsRsp) */ for(idx=0; idxnumGrpRejected; idx++) { + actionInfoDb = NULLP; actionId = statsRsp->statsGrpRejectedList[idx].groupId; - if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId) + actionInfoDb = fetchActionInfoFromActionId(actionId, ricSubscriptionInfo, &actionNode); + if(actionInfoDb->actionId == actionId) { - memset(&ricSubscriptionInfo->actionSequence[actionId], 0, sizeof(ActionInfo)); - ricSubscriptionInfo->numOfActions--; - + deleteActionSequence(actionNode); pendingSubsRsp->rejectedActionList[pendingSubsRsp->numOfRejectedActions].id = actionId; convertDuCauseToE2Cause(statsRsp->statsGrpRejectedList[idx].cause, \ &pendingSubsRsp->rejectedActionList[pendingSubsRsp->numOfRejectedActions].failureCause); @@ -738,6 +752,7 @@ uint8_t e2ProcStatsInd(MacStatsInd *statsInd) uint8_t statsIdx = 0; RanFunction *ranFuncDb = NULLP; CmLList *ricSubscriptionNode = NULLP; + CmLList *actionNode = NULLP; RicSubscription *ricSubscriptionInfo = NULLP; ActionInfo *actionInfo = NULLP; ActionDefFormat1 *actionFormat = NULLP; @@ -763,7 +778,7 @@ uint8_t e2ProcStatsInd(MacStatsInd *statsInd) } /* Fetch RIC subscription's action DB */ - actionInfo = fetchActionInfoFromActionId(statsInd->groupId, ricSubscriptionInfo); + actionInfo = fetchActionInfoFromActionId(statsInd->groupId, ricSubscriptionInfo, &actionNode); if(actionInfo == NULLP) { DU_LOG("\nERROR --> E2AP : extractStatsMeasurement: Failed to fetch action ID [%d]", statsInd->groupId); @@ -851,13 +866,15 @@ void E2apHdlRicSubsReportTmrExp(RicSubscription *ricSubscription) { uint8_t actionIdx = 0; uint32_t reportingPeriod = 0; + ActionInfo *action=NULLP; + CmLList *actionNode=NULLP; - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) + CM_LLIST_FIRST_NODE(&ricSubscription->actionSequence, actionNode); + while(actionNode) { - if(ricSubscription->actionSequence[actionIdx].actionId >= 0) - { - BuildAndSendRicIndication(ricSubscription, &ricSubscription->actionSequence[actionIdx]); - } + action = (ActionInfo*)actionNode->node; + BuildAndSendRicIndication(ricSubscription, action); + actionNode = actionNode->next; } /* Start RIC Subscription reporting timer again */ @@ -1288,31 +1305,67 @@ void deleteMeasurementInfoList(CmLListCp *measInfoList) * @return void * * ****************************************************************/ -void deleteActionSequence(ActionInfo *action) +void deleteActionSequence(CmLList *actionNode) { + ActionInfo *action = NULLP; ActionDefinition *definition=NULLP; - definition= &action->definition; - switch(definition->formatType) + if(actionNode) { - case 1: - { - deleteMeasurementInfoList(&definition->choice.format1.measurementInfoList); - break; - } + action = (ActionInfo*)actionNode->node; + definition= &action->definition; - case 2: - case 3: - case 4: - case 5: - default: + switch(definition->formatType) { - DU_LOG("\nERROR --> E2AP : Format %d does not supported", definition->formatType); - break; + case 1: + { + deleteMeasurementInfoList(&definition->choice.format1.measurementInfoList); + break; + } + + case 2: + case 3: + case 4: + case 5: + default: + { + DU_LOG("\nERROR --> E2AP : Format %d does not supported", definition->formatType); + break; + } } + memset(action, 0, sizeof(ActionInfo)); + DU_FREE(actionNode->node, sizeof(ActionInfo)); + DU_FREE(actionNode, sizeof(CmLList)); + } +} + +/****************************************************************** + * + * @brief Delete Ric subscription action list + * + * @details + * + * Function : deleteActionSequenceList + * + * Functionality: Delete Ric subscription action list + * + * @params[in] Action info list + * + * @return void + * + * ****************************************************************/ +void deleteActionSequenceList(CmLListCp *actionList) +{ + CmLList *actionNode=NULLP; + + CM_LLIST_FIRST_NODE(actionList, actionNode); + while(actionNode) + { + cmLListDelFrm(actionList, actionNode); + deleteActionSequence(actionNode); + CM_LLIST_FIRST_NODE(actionList, actionNode); } - memset(action, 0, sizeof(ActionInfo)); - action->actionId = -1; + } /****************************************************************** @@ -1332,19 +1385,11 @@ void deleteActionSequence(ActionInfo *action) * ****************************************************************/ 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]); - } - } - + deleteActionSequenceList(&ricSubscriptionInfo->actionSequence); if(duChkTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR) == TRUE) { duStopTmr((PTR)ricSubscriptionInfo, EVENT_RIC_SUBSCRIPTION_REPORTING_TMR); diff --git a/src/du_app/du_e2ap_mgr.h b/src/du_app/du_e2ap_mgr.h index 471f92121..9952474d8 100644 --- a/src/du_app/du_e2ap_mgr.h +++ b/src/du_app/du_e2ap_mgr.h @@ -400,8 +400,7 @@ typedef struct RicRequestId requestId; uint16_t ranFuncId; EventTriggerDefinition eventTriggerDefinition; - uint8_t numOfActions; - ActionInfo actionSequence[MAX_RIC_ACTION]; + CmLListCp actionSequence; CmTimer ricSubsReportTimer; ConfigType action; E2FailureCause failureCause; /* Used only when a subscription is required to be deleted */ @@ -510,7 +509,7 @@ typedef struct e2ConnectionList }E2ConnectionList; uint8_t assignTransactionId(); -ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo); +ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo, CmLList ** actionNode); RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb, CmLList **ricSubscriptionNode); RanFunction *fetchRanFuncFromRanFuncId(uint16_t ranFuncId); uint8_t fetchSubsInfoFromSubsId(uint64_t subscriptionId, RanFunction **ranFuncDb, CmLList **ricSubscriptionNode, \ @@ -530,7 +529,7 @@ uint8_t fillE2NodeComponentRspInfo(InterfaceType interfaceType, uint64_t compone void deleteRicSubscriptionList(CmLListCp *subscriptionList); void deleteRicSubscriptionNode(CmLList *ricSubscriptionInfo); void deleteMeasurementInfoList(CmLListCp *measInfoList); -void deleteActionSequence(ActionInfo *action); +void deleteActionSequence(CmLList *action); void deleteMeasuredValueList(CmLListCp *measuredValueList); void removeE2NodeInformation(); void encodeSubscriptionId(uint64_t *subscriptionId, uint16_t ranFuncId, RicRequestId ricReqId); diff --git a/src/du_app/du_e2ap_msg_hdl.c b/src/du_app/du_e2ap_msg_hdl.c index 593fd3d8a..5a1c1dd8e 100644 --- a/src/du_app/du_e2ap_msg_hdl.c +++ b/src/du_app/du_e2ap_msg_hdl.c @@ -3244,6 +3244,112 @@ uint8_t extractRicActionDef(RanFunction *ranFuncDb, ActionDefinition *actionDefD return RFAILED; } +/******************************************************************* + * + * @brief add RIC Subs action info + * + * @details + * + * Function : addRicSubsAction + * + * Functionality: add Ric Subs action info + * + * @parameter + * RAN function DB + * Pointer to Ric Subc info + * Action Sequence list + * Procedure Code + * E2 Failure Cause + * @return ROK - success + * RFAILED - failure + * + ******************************************************************/ + +CmLList *addRicSubsAction(RanFunction *ranFuncDb, PTR ricSubsInfo, CmLListCp *actionSequence, uint8_t procedureCode, E2FailureCause *failureCause) +{ + CmLList *actionNode = NULLP; + ActionInfo *actionDb = NULLP; + RICactionID_t ricActionID; + RICactionType_t ricActionType; + RICactionDefinition_t *ricActionDefinition= NULLP; + RICaction_ToBeSetup_Item_t *setupItem= NULLP; + RICaction_ToBeAddedForModification_Item_t *addIem= NULLP; + RICaction_ToBeModifiedForModification_Item_t *modifiedItem= NULLP; + RICaction_ToBeRemovedForModification_Item_t *removedItem= NULLP; + + switch(procedureCode) + { + case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item: + { + setupItem = (RICaction_ToBeSetup_Item_t *)ricSubsInfo; + ricActionID= setupItem->ricActionID; + ricActionType= setupItem->ricActionType; + if(setupItem->ricActionDefinition) + { + ricActionDefinition = setupItem->ricActionDefinition; + } + break; + } + case ProtocolIE_IDE2_id_RICactionsToBeAddedForModification_List: + { + addIem = (RICaction_ToBeAddedForModification_Item_t*) ricSubsInfo; + ricActionID= addIem->ricActionID; + ricActionType= addIem->ricActionType; + ricActionDefinition = &addIem->ricActionDefinition; + + break; + } + case ProtocolIE_IDE2_id_RICactionsToBeModifiedForModification_List: + { + modifiedItem= (RICaction_ToBeModifiedForModification_Item_t*)ricSubsInfo; + ricActionID= modifiedItem->ricActionID; + if(modifiedItem->ricActionDefinition) + { + ricActionDefinition = modifiedItem->ricActionDefinition; + } + break; + } + case ProtocolIE_IDE2_id_RICactionsToBeRemovedForModification_List: + { + removedItem= (RICaction_ToBeRemovedForModification_Item_t*)ricSubsInfo; + ricActionID= removedItem->ricActionID; + break; + } + } + + + DU_ALLOC(actionDb, sizeof(ActionInfo)); + if(actionDb==NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__); + return NULLP; + } + if(ricActionType== RICactionType_report) + { + actionDb->actionId = ricActionID; + actionDb->type = REPORT; + + if(extractRicActionDef(ranFuncDb, &actionDb->definition, ricActionDefinition, failureCause) == ROK) + { + actionDb->action = CONFIG_ADD; + } + + DU_ALLOC(actionNode, sizeof(CmLList)); + if(actionNode) + { + actionNode->node = (PTR) actionDb; + cmLListAdd2Tail(actionSequence, actionNode); + } + else + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__); + DU_FREE(actionDb, sizeof(ActionInfo)); + return NULLP; + } + } + return actionNode; + +} /******************************************************************* * * @brief Extract RIC Action to be setup @@ -3266,6 +3372,7 @@ uint8_t extractRicActionDef(RanFunction *ranFuncDb, ActionDefinition *actionDefD uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \ RICactions_ToBeSetup_List_t *actionList, E2FailureCause *failureCause, PendingSubsRspInfo *subsRsp) { + CmLList *actionNode = NULLP; uint8_t actionIdx = 0; uint8_t ricActionId = 0; RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP; @@ -3283,35 +3390,23 @@ uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSu * If RIC action definition's extraction and validation passes, * Then : * This action is added to action sequence list of subscription info */ - ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID; - - if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType == RICactionType_report) + actionNode = addRicSubsAction(ranFuncDb, (PTR)&actionItem->value.choice.RICaction_ToBeSetup_Item,\ + &ricSubscriptionInfo->actionSequence, ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item, failureCause); + + if(!actionNode) { - ricSubscriptionInfo->actionSequence[ricActionId].actionId = ricActionId; - ricSubscriptionInfo->actionSequence[ricActionId].type = REPORT; - - if(extractRicActionDef(ranFuncDb, &ricSubscriptionInfo->actionSequence[ricActionId].definition, \ - actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, failureCause) == ROK) + /* In case of any failure, action is rejected + * Added to rejected-action-list in subscription response */ + subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].id = ricActionId; + if(failureCause->causeType == E2_NOTHING) { - ricSubscriptionInfo->actionSequence[ricActionId].action = CONFIG_ADD; - ricSubscriptionInfo->numOfActions++; - break; + failureCause->causeType = E2_RIC_REQUEST; + failureCause->cause = E2_ACTION_NOT_SUPPORTED; } + memcpy(&subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].failureCause, \ + failureCause, sizeof(E2FailureCause)); + subsRsp->numOfRejectedActions++; } - - /* In case of any failure, action is rejected - * Added to rejected-action-list in subscription response */ - deleteActionSequence(&ricSubscriptionInfo->actionSequence[ricActionId]); - - subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].id = ricActionId; - if(failureCause->causeType == E2_NOTHING) - { - failureCause->causeType = E2_RIC_REQUEST; - failureCause->cause = E2_ACTION_NOT_SUPPORTED; - } - memcpy(&subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].failureCause, \ - failureCause, sizeof(E2FailureCause)); - subsRsp->numOfRejectedActions++; break; } default: @@ -3322,7 +3417,7 @@ uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSu } /* If there is even 1 action that can be added, return ROK */ - if(ricSubscriptionInfo->numOfActions) + if(ricSubscriptionInfo->actionSequence.count) return ROK; if(failureCause->causeType == E2_NOTHING) @@ -3350,7 +3445,7 @@ uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSu * ****************************************************************/ uint8_t procRicSubscriptionRequest(E2AP_PDU_t *e2apMsg) { - uint8_t idx = 0, actionIdx = 0; + uint8_t idx = 0; uint8_t ret = ROK; uint16_t ranFuncId = 0; RicRequestId ricReqId; @@ -3417,11 +3512,6 @@ uint8_t procRicSubscriptionRequest(E2AP_PDU_t *e2apMsg) ricSubscriptionInfo->requestId.instanceId = ricReqId.instanceId; ricSubscriptionInfo->ranFuncId = ranFuncId; - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) - { - ricSubscriptionInfo->actionSequence[actionIdx].actionId = -1; - } - memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo)); memcpy(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].requestId, &ricReqId, sizeof(RicRequestId)); @@ -6207,10 +6297,12 @@ void FreeRicSubsModRequired(E2AP_PDU_t *e2apMsg) * RFAILED - failure * ******************************************************************/ -uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *actionToBeModList, uint8_t numActionsMod, \ - RicSubscription *ricSubscription) +uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *actionToBeModList, uint8_t numActionsMod,\ + RicSubscription *ricSubscription) { - uint8_t arrIdx = 0, actionIdx = 0; + uint8_t arrIdx = 0; + CmLList *actionNode = NULLP; + ActionInfo *actionDb = NULLP; RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULL; actionToBeModList->list.count = numActionsMod; @@ -6223,9 +6315,11 @@ uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *action } arrIdx = 0; - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) + CM_LLIST_FIRST_NODE(&ricSubscription->actionSequence, actionNode); + while(actionNode) { - if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD) + actionDb = (ActionInfo*)(actionNode->node); + if(actionDb->action == CONFIG_MOD) { DU_ALLOC(actionToBeModList->list.array[arrIdx], sizeof(RICaction_RequiredToBeModified_ItemIEs_t)); if(!actionToBeModList->list.array[arrIdx]) @@ -6240,7 +6334,7 @@ uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *action actionToBeMod->value.present = \ RICaction_RequiredToBeModified_ItemIEs__value_PR_RICaction_RequiredToBeModified_Item; actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID = \ - ricSubscription->actionSequence[actionIdx].actionId; + actionDb->actionId; actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricTimeToWait = RICtimeToWait_w5ms; arrIdx++; @@ -6250,7 +6344,6 @@ uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *action return ROK; } #endif - /******************************************************************* * * @brief Fill Action required to be removed list @@ -6271,7 +6364,9 @@ uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *action uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList, uint8_t numActionsRmv, \ RicSubscription *ricSubscription) { - uint8_t arrIdx = 0, actionIdx = 0; + uint8_t arrIdx = 0; + CmLList *actionNode = NULLP; + ActionInfo *actionDb = NULLP; RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULL; actionToBeRmvList->list.count = numActionsRmv; @@ -6284,9 +6379,11 @@ uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionT } arrIdx = 0; - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) + CM_LLIST_FIRST_NODE(&ricSubscription->actionSequence, actionNode); + while(actionNode) { - if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL) + actionDb = (ActionInfo*)(actionNode->node); + if(actionDb->action == CONFIG_DEL) { DU_ALLOC(actionToBeRmvList->list.array[arrIdx], sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t)); if(!actionToBeRmvList->list.array[arrIdx]) @@ -6300,11 +6397,8 @@ uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionT actionToBeRmv->criticality = CriticalityE2_reject; actionToBeRmv->value.present = \ RICaction_RequiredToBeRemoved_ItemIEs__value_PR_RICaction_RequiredToBeRemoved_Item; - actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID = \ - ricSubscription->actionSequence[actionIdx].actionId; - fillE2Cause(&actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.cause, \ - ricSubscription->actionSequence[actionIdx].failureCause); - + actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID = actionDb->actionId; + fillE2Cause(&actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.cause, actionDb->failureCause); arrIdx++; } } @@ -6330,7 +6424,9 @@ uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionT ******************************************************************/ uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsModReqd, RicSubscription *ricSubscription) { - uint8_t ieIdx = 0, elementCnt=0, actionIdx = 0; + ActionInfo * actionDb=NULLP; + CmLList *actionNode = NULLP; + uint8_t ieIdx = 0, elementCnt=0; uint8_t numActionsMod = 0, numActionsRmv = 0; RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP; RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP; @@ -6341,12 +6437,15 @@ uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsMod #endif /* Count number of Actions to be modified or deleted */ - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) + CM_LLIST_FIRST_NODE(&ricSubscription->actionSequence, actionNode); + while(actionNode) { - if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD) - numActionsMod++; - else if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL) - numActionsRmv++; + actionDb = (ActionInfo*)(actionNode->node); + if(actionDb->action == CONFIG_MOD) + numActionsMod++; + else if(actionDb->action == CONFIG_DEL) + numActionsRmv++; + actionNode = actionNode->next; } /* Count number of IEs to be added to messages */ @@ -6659,6 +6758,7 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) RicRequestId ricReqId; RanFunction *ranFuncDb = NULLP; CmLList *ricSubsNode = NULLP; + CmLList *actionNode= NULLP; RicSubscription *ricSubsDb = NULLP; ActionInfo *actionDb = NULLP; @@ -6758,7 +6858,7 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx]; actionId = modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID; - actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb); + actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb, &actionNode); if(!actionDb) { DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId); @@ -6781,7 +6881,7 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) { modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx]; actionId = modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID; - actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb); + actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb, &actionNode); if(!actionDb) { DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId); @@ -6806,16 +6906,15 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) { rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx]; actionId = rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID; - actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb); + actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb, &actionNode); if(!actionDb) { DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId); } else { - deleteActionSequence(actionDb); + deleteActionSequence(actionNode); actionDb =NULLP; - ricSubsDb->numOfActions--; /* Further handling can include : * Deletion of this action from all DU layers */ @@ -6832,7 +6931,7 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) { rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx]; actionId = rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID; - actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb); + actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb, &actionNode); if(!actionDb) { DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId); @@ -9649,7 +9748,7 @@ void procRicSubscriptionModificationRequest(E2AP_PDU_t *e2apMsg) DU_LOG("\nERROR --> E2AP : %s: Initiating Message in E2AP PDU is NULL", __func__); break; } - + ricSubsModifyReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequest; for(ieIdx = 0; ieIdx < ricSubsModifyReq->protocolIEs.list.count; ieIdx++) { diff --git a/src/ric_stub/ric_e2ap_msg_hdl.c b/src/ric_stub/ric_e2ap_msg_hdl.c index 8ca54deca..bed82e70a 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.c +++ b/src/ric_stub/ric_e2ap_msg_hdl.c @@ -175,6 +175,52 @@ uint8_t assignTransactionId(DuDb *duDb) return currTransId; } + /******************************************************************* + * + * @brief add RIC Subs action info + * + * @details + * + * Function : addRicSubsAction + * + * Functionality: add Ric Subs action info + * + * @parameter + * RIC action id + * List of action + * @return ROK - success + * RFAILED - failure + * + ******************************************************************/ +CmLList *addRicSubsAction(uint8_t ricActionID, CmLListCp *actionSequence) +{ + ActionInfo *actionDb = NULLP; + CmLList *actionNode=NULLP; + + RIC_ALLOC(actionDb, sizeof(ActionInfo)); + if(actionDb==NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__); + return NULLP; + } + + actionDb->actionId = ricActionID; + RIC_ALLOC(actionNode, sizeof(CmLList)); + if(actionNode) + { + actionNode->node = (PTR) actionDb; + cmLListAdd2Tail(actionSequence, actionNode); + } + else + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__); + RIC_FREE(actionDb, sizeof(ActionInfo)); + return NULLP; + } + + return actionNode; +} + /******************************************************************* * * @brief Sends E2 msg over SCTP @@ -479,22 +525,30 @@ RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *r * * @params[in] Action ID * RIC Subscription DB + * List of action * @return Action Info DB * NULL, in case of failure * * ****************************************************************/ -ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo) +ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo, CmLList ** actionNode) { ActionInfo *actionInfoDb = NULLP; - if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId) + + CM_LLIST_FIRST_NODE(&ricSubscriptionInfo->actionSequence, *actionNode); + while(*actionNode) { - actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId]; + actionInfoDb = (ActionInfo*)((*actionNode)->node); + if(actionInfoDb->actionId == actionId) + { + break; + } + *actionNode= (*actionNode)->next; } - else + if(actionInfoDb==NULLP) { 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); + subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\ + ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId); } return actionInfoDb; @@ -1903,7 +1957,7 @@ uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef, uint8_t ricActionI uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb) { static uint8_t ricActionId = 0; - + CmLList *actionNode=NULLP; if(actionItem == NULLP) { DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__); @@ -1918,8 +1972,7 @@ uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscr /* RIC Action ID */ actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId; - ricSubsDb->actionSequence[ricActionId].actionId = \ - actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID; + actionNode = addRicSubsAction(ricActionId, &ricSubsDb->actionSequence); ricActionId++; /* RIC Action Type */ @@ -1938,12 +1991,13 @@ uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscr break; } - ricSubsDb->numOfActions++; return ROK; } - - memset(&ricSubsDb->actionSequence[ricActionId], 0, sizeof(ActionInfo)); - ricSubsDb->actionSequence[ricActionId].actionId = -1; + + if(actionNode) + { + deleteActionSequence(actionNode); + } return RFAILED; } @@ -2156,10 +2210,6 @@ uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb) DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__); return RFAILED; } - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) - { - ricSubsInfo->actionSequence[actionIdx].actionId = -1; - } while(true) { @@ -2319,6 +2369,7 @@ void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricS RanFunction *ranFuncDb = NULLP; RicSubscription *ricSubs = NULLP; CmLList *ricSubsNode = NULLP; + CmLList *actionNode = NULLP; ActionInfo *action = NULLP; RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP; RICaction_NotAdmitted_List_t *notAdmitList = NULLP; @@ -2375,6 +2426,7 @@ void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricS notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List; for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++) { + actionNode=NULLP; actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\ value.choice.RICaction_NotAdmitted_Item.ricActionID; @@ -2382,12 +2434,10 @@ void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricS ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode); if(ricSubs) { - action = fetchActionInfoFromActionId(actionId, ricSubs); + action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode); if(action) { - memset(action, 0, sizeof(ActionInfo)); - ricSubs->actionSequence[actionId].actionId = -1; - ricSubs->numOfActions--; + deleteActionSequence(action); } } } @@ -4479,6 +4529,7 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t RanFunction *ranFuncDb = NULLP; RicSubscription *ricSubs = NULLP; CmLList *ricSubsNode = NULLP; + CmLList *actionNode = NULLP; ActionInfo *action = NULLP; RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP; RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP; @@ -4537,9 +4588,10 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List; for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++) { + actionNode=NULLP; actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx]; actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID; - action = fetchActionInfoFromActionId(actionId, ricSubs); + action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode); if(action) { /* No modification required as of now, hence directly adding to the list */ @@ -4562,15 +4614,14 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List; for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++) { + actionNode=NULLP; actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx]; actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID; - action = fetchActionInfoFromActionId(actionId, ricSubs); + action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode); if(action) { tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId; - memset(action, 0, sizeof(ActionInfo)); - action->actionId = -1; - ricSubs->numOfActions--; + deleteActionSequence(action); } } break; @@ -4963,6 +5014,63 @@ uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t re return ret; } +/****************************************************************** + * + * @brief Delete Ric subscription action + * + * @details + * + * Function : deleteActionSequence + * + * Functionality: Delete Ric subscription action + * + * @params[in] Action info + * + * @return void + * + * ****************************************************************/ +void deleteActionSequence(CmLList *actionNode) +{ + ActionInfo *action = NULLP; + + if(actionNode) + { + action = (ActionInfo*)actionNode->node; + memset(action, 0, sizeof(ActionInfo)); + RIC_FREE(actionNode->node, sizeof(ActionInfo)); + RIC_FREE(actionNode, sizeof(CmLList)); + } +} + +/****************************************************************** + * + * @brief Delete Ric subscription action list + * + * @details + * + * Function : deleteActionSequenceList + * + * Functionality: Delete Ric subscription action list + * + * @params[in] Action info list + * + * @return void + * + * ****************************************************************/ +void deleteActionSequenceList(CmLListCp *actionList) +{ + CmLList *actionNode=NULLP; + + CM_LLIST_FIRST_NODE(actionList, actionNode); + while(actionNode) + { + cmLListDelFrm(actionList, actionNode); + deleteActionSequence(actionNode); + CM_LLIST_FIRST_NODE(actionList, actionNode); + } + +} + /****************************************************************** * * @brief Delete Ric subscription node @@ -4984,14 +5092,9 @@ void deleteRicSubscriptionNode(CmLList *subscriptionNode) RicSubscription *ricSubscriptionInfo = NULLP; ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node; - - for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) - { - if(ricSubscriptionInfo->actionSequence[actionIdx].actionId > -1) - { - memset(&ricSubscriptionInfo->actionSequence[actionIdx], 0, sizeof(ActionInfo)); - } - } + + deleteActionSequenceList(&ricSubscriptionInfo->actionSequence); + memset(ricSubscriptionInfo, 0, sizeof(RicSubscription)); RIC_FREE(subscriptionNode->node, sizeof(RicSubscription)); RIC_FREE(subscriptionNode, sizeof(CmLList)); @@ -7607,6 +7710,7 @@ uint8_t BuildRicSubsActionToBeRemoved(RICactions_ToBeRemovedForModification_List uint8_t BuildRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t *addedActionList, RicSubscription **ricSubsInfo, uint8_t numOfActionToBeAdded, ActionInfo *actionToBeAdded) { uint8_t arrIdx=0; + CmLList *actionNode=NULLP; RICaction_ToBeAddedForModification_ItemIEs_t *addedActionItemIe; addedActionList->list.count = numOfActionToBeAdded; @@ -7640,8 +7744,13 @@ uint8_t BuildRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t * DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__); break; } - (*ricSubsInfo)->actionSequence[(*ricSubsInfo)->numOfActions].actionId = (*ricSubsInfo)->numOfActions; - (*ricSubsInfo)->numOfActions++; + + actionNode = addRicSubsAction((*ricSubsInfo)->actionSequence.count, &(*ricSubsInfo)->actionSequence); + if(actionNode == NULLP) + { + DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__); + return RFAILED; + } } return ROK; } @@ -7847,32 +7956,38 @@ uint8_t BuildAndSendRicSubscriptionModReq(DuDb *duDb, RicSubscription **ricSubsI void BuildRicSubsModificationReq(DuDb *duDb, RicSubscription *ricSubsInfo) { + CmLList *actionNode=NULLP; uint8_t actionToBeAdded =0; uint8_t actionIdx =0, tmpActionIdx=0; + ActionInfo *actionInfoDb = NULLP; RicSubsModReq ricSubsModReq; if(ricSubsInfo) { memset(&ricSubsModReq, 0, sizeof(RicSubsModReq)); - for(actionIdx=0; actionIdxnumOfActions; actionIdx++) + + + CM_LLIST_FIRST_NODE(&ricSubsInfo->actionSequence, actionNode); + while(actionNode) { + actionInfoDb = (ActionInfo*)(actionNode->node); /* Change the condition based on the action required to be modiified or removed */ - if(actionIdx%2 == 0) + if(((actionInfoDb->actionId)%2) == 0) { tmpActionIdx = ricSubsModReq.numOfActionToBeModify; - ricSubsModReq.actionToBeModify[tmpActionIdx].actionId = ricSubsInfo->actionSequence[actionIdx].actionId; + ricSubsModReq.actionToBeModify[tmpActionIdx].actionId = actionInfoDb->actionId; ricSubsModReq.numOfActionToBeModify++; } else { tmpActionIdx = ricSubsModReq.numOfActionToBeRemove; - ricSubsModReq.actionToBeRemove[tmpActionIdx].actionId = ricSubsInfo->actionSequence[actionIdx].actionId; + ricSubsModReq.actionToBeRemove[tmpActionIdx].actionId = actionInfoDb->actionId; ricSubsModReq.numOfActionToBeRemove++; } } /* Change the value of actionToBeAdded based on the number of action required to be added */ actionToBeAdded =1; - tmpActionIdx = ricSubsInfo->numOfActions; + tmpActionIdx = ricSubsInfo->actionSequence.count; for(actionIdx=0; actionIdx