[Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] Changes in RIC Subscription action structure 10/12110/2
authorpborla <pborla@radisys.com>
Thu, 23 Nov 2023 08:46:07 +0000 (14:16 +0530)
committerpborla <pborla@radisys.com>
Thu, 23 Nov 2023 10:58:26 +0000 (16:28 +0530)
Change-Id: I9479eb94159379942e011872d21e398ffb88174c
Signed-off-by: pborla <pborla@radisys.com>
src/du_app/du_e2ap_mgr.c
src/du_app/du_e2ap_mgr.h
src/du_app/du_e2ap_msg_hdl.c
src/ric_stub/ric_e2ap_msg_hdl.c
src/ric_stub/ric_stub.h

index eabc0d6..c104722 100644 (file)
@@ -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; idx<statsRsp->numGrpRejected; 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);
index 471f921..9952474 100644 (file)
@@ -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);
index 593fd3d..5a1c1dd 100644 (file)
@@ -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++)
       {
index 8ca54de..bed82e7 100644 (file)
@@ -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; actionIdx<ricSubsInfo->numOfActions; 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<actionToBeAdded; actionIdx++)
       {
          ricSubsModReq.actionToBeAdded[actionIdx].actionId = tmpActionIdx;
index a2663de..ac51011 100644 (file)
@@ -116,8 +116,7 @@ typedef struct ricSubscription
 {
    RicRequestId    requestId;
    uint16_t        ranFuncId;
-   uint8_t         numOfActions;
-   ActionInfo      actionSequence[MAX_RIC_ACTION];
+   CmLListCp       actionSequence;
 }RicSubscription;
 
 typedef struct