Merge "[Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-534] Implementation of Reset request...
authorPriyanka Borla <pborla@radisys.com>
Thu, 5 Oct 2023 10:12:41 +0000 (10:12 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Thu, 5 Oct 2023 10:12:41 +0000 (10:12 +0000)
1  2 
src/ric_stub/ric_e2ap_msg_hdl.c

@@@ -125,108 -125,6 +125,108 @@@ uint8_t SendE2APMsg(Region region, Poo
     return ROK;
  } /* SendE2APMsg */
  
 +/*******************************************************************
 + *
 + * @brief Fetches RAN Function DB
 + *
 + * @details
 + *
 + *    Function : fetchRanFuncFromRanFuncId
 + *
 + *    Functionality: Fetches RAN function DB from E2AP DB using
 + *       RAN function ID
 + *
 + * @params[in] RAN Function ID
 + * @return RAN Function DB
 + *         NULL, in case of failure
 + *
 + * ****************************************************************/
 +RanFunction *fetchRanFuncFromRanFuncId(DuDb *duDb, uint16_t ranFuncId)
 +{
 +   RanFunction *ranFuncDb = NULLP;
 +
 +   /* Fetch RAN Function DB */
 +   if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
 +   {
 +      ranFuncDb = &duDb->ranFunction[ranFuncId-1];
 +   }
 +   else
 +   {
 +      DU_LOG("\nERROR  -->  DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
 +   }
 +
 +   return ranFuncDb;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fetch subscripton DB
 + *
 + * @details
 + *
 + *    Function : fetchSubsInfoFromRicReqId
 + *
 + *    Functionality: Fetches subscription DB from RAN Function DB
 + *       using RIC Request ID
 + *
 + * @params[in] RIC Request ID
 + *             RAN Function DB
 + *             Pointer to RIC Subscription node to be searched
 + * @return RIC Subscription from RAN Function's subcription list
 + *         NULL, in case of failure
 + *
 + * ****************************************************************/
 +RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb)
 +{
 +   uint8_t subsIdx = 0;
 +   RicSubscription *ricSubscriptionInfo = NULLP;
 +
 +   for(subsIdx = 0; subsIdx < ranFuncDb->numOfSubscription; subsIdx++)
 +   {
 +      if((ranFuncDb->subscriptionList[subsIdx].requestId.requestorId == ricReqId.requestorId) &&
 +            (ranFuncDb->subscriptionList[subsIdx].requestId.instanceId == ricReqId.instanceId))
 +      {
 +         ricSubscriptionInfo = &ranFuncDb->subscriptionList[subsIdx];
 +         break;
 +      }
 +   }
 +   return ricSubscriptionInfo;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fetch Action details
 + *
 + * @details
 + *
 + *    Function : fetchActionInfoFromActionId
 + *
 + *    Functionality: Fetch action details from RIC subscription DB
 + *       using action ID
 + *
 + * @params[in] Action ID
 + *             RIC Subscription DB
 + * @return Action Info DB
 + *         NULL, in case of failure
 + *
 + * ****************************************************************/
 +ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo)
 +{
 +   ActionInfo *actionInfoDb = NULLP;
 +   if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
 +   {
 +      actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId];
 +   }
 +   else
 +   {
 +      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);
 +
 +   }
 +   return actionInfoDb;
 +}
 +
  /*******************************************************************
   *
   * @brief deallocate memory allocated in E2 Node Config Update Failure
@@@ -412,8 -310,9 +412,8 @@@ uint8_t BuildAndSendE2NodeConfigUpdateF
  
  void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
  {
 -   uint8_t ieIdx = 0, duIdx = 0;
 +   uint8_t ieIdx = 0;
     uint8_t transId = 0, e2NodeUpdateListIdx=0;
 -   DuDb    *duDb = NULLP;
     E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
     E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
     E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
@@@ -1208,10 -1107,9 +1208,10 @@@ uint8_t fillActionToBeSetup(RICaction_T
        actionItem->value.present =  RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
        
        /* RIC Action ID */
 -      actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId++;
 +      actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId;
        ricSubsDb->actionSequence[ricActionId].actionId = \
           actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
 +      ricActionId++;
  
        /* RIC Action Type */
        actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
@@@ -1578,14 -1476,12 +1578,14 @@@ uint8_t BuildAndSendRicSubscriptionReq(
  
  void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t  *ricSubscriptionRsp)
  {
 -   uint8_t duIdx = 0, ieIdx = 0,subsIdx = 0, notAdmitIdx = 0;
 +   uint8_t duIdx = 0, ieIdx = 0, notAdmitIdx = 0;
     uint8_t ranFuncId = 0, actionId = 0;
     DuDb *duDb = NULLP;
     bool ricReqIdDecoded = false;
     RicRequestId ricReqId;
     RanFunction  *ranFuncDb = NULLP;
 +   RicSubscription *ricSubs = NULLP;
 +   ActionInfo *action = NULLP;
     RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
     RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
  
                    case ProtocolIE_IDE2_id_RANfunctionID:
                       {
                          ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
 -                        if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
 -                        {
 -                           ranFuncDb = &duDb->ranFunction[ranFuncId-1];
 -                        }
 -                        else
 +                        ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
 +                        if(!ranFuncDb)
                          {
                             DU_LOG("\nERROR  -->  E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
                             return;
                             actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
                                value.choice.RICaction_NotAdmitted_Item.ricActionID;
  
 -                              /* Remove action from RAN Function's subscription list */
 -                              for(subsIdx = 0; subsIdx < ranFuncDb->numOfSubscription; subsIdx++)
 +                           /* Remove action from RAN Function's subscription list */
 +                           ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb);
 +                           if(ricSubs)
 +                           {
 +                              action = fetchActionInfoFromActionId(actionId, ricSubs);
 +                              if(action)
                                {
 -                                 if((ranFuncDb->subscriptionList[subsIdx].requestId.requestorId == ricReqId.requestorId) &&
 -                                       (ranFuncDb->subscriptionList[subsIdx].requestId.instanceId == ricReqId.instanceId))
 -                                 {
 -                                    if(ranFuncDb->subscriptionList[subsIdx].actionSequence[actionId].actionId == actionId)
 -                                    {
 -                                       memset(&ranFuncDb->subscriptionList[subsIdx].actionSequence[actionId], 0, \
 -                                          sizeof(ActionInfo));
 -                                       ranFuncDb->subscriptionList[subsIdx].actionSequence[actionId].actionId = -1;
 -                                       ranFuncDb->subscriptionList[subsIdx].numOfActions--;
 -                                       break;
 -                                    }
 -                                 }
 +                                 memset(action, 0, sizeof(ActionInfo));
 +                                 ricSubs->actionSequence[actionId].actionId = -1;
 +                                 ricSubs->numOfActions--;
                                }
 +                           }
                          }
                          break;
                       }
@@@ -1721,7 -1624,6 +1721,7 @@@ void FreeE2SetupFailure(E2AP_PDU_t *e2a
  
  uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
  {
 +   uint8_t            ret = RFAILED;
     E2AP_PDU_t         *e2apMsg = NULL;
     E2setupFailure_t   *e2SetupFailure;
     asn_enc_rval_t     encRetVal;
           DU_LOG("\nERROR  -->  E2AP : Sending E2 Setup Failure failed");
           break;
        }
 +
 +      ret = ROK;
        break;
     }
  
     FreeE2SetupFailure(e2apMsg);
 +   return ret;
  }
  
  /*******************************************************************
@@@ -2027,7 -1926,8 +2027,7 @@@ uint8_t BuildAndSendResetResponse(uint3
        if(e2apMsg->choice.successfulOutcome == NULLP)
        {
           DU_LOG("\nERROR  -->  E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
 -         RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
 -         return RFAILED;
 +         break;
        }
   
        e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
        {
           DU_LOG("\nERROR  -->  E2AP : Could not encode E2 reset response structure (at %s)\n",\
                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
 -         return RFAILED;
 +         break;
        }
        else
        {
        if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
        {
           DU_LOG("\nERROR  -->  E2AP : Failed to send E2 Reset Response");
 -         return RFAILED;
 +         break;
        }
  
        ret = ROK;
     }while(true);
  
     FreeE2ResetResponse(e2apMsg);
 -   return ROK;
 +   return ret;
  }
  
  /*******************************************************************
  
  uint8_t ProcE2ResetReq(uint32_t duId, ResetRequestE2_t  *resetReq)
  {
 -   uint8_t ieIdx = 0, duIdx = 0;
 +   uint8_t ieIdx = 0;
     uint8_t transId = 0, cause = 0;
 -   DuDb    *duDb = NULLP;
  
     if(resetReq)
     {
@@@ -2868,7 -2769,6 +2868,7 @@@ void ProcRicServiceUpdate(uint32_t duId
     int8_t transId =-1;
     uint8_t duIdx = 0, elementCnt =0, arrIdx = 0; 
     uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
 +   RanFunction *ranFuncDb = NULLP;
     RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
     RANfunction_Item_t  *ranFuncItem =NULL;
     RANfunctionID_Item_t  *ranFuncIdItem=NULL;
                    {
                       ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
                       ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
 -                     if(duDb->ranFunction[ranFuncItem->ranFunctionID-1].id != ranFuncItem->ranFunctionID)
 +                     if(fetchRanFuncFromRanFuncId(duDb, ranFuncItem->ranFunctionID) == NULLP)
                       {
                          /* Calculating total number of ran fuctions which are not present */
                          failedRanFuncCount++;
                    {
                       delRanFuncItem  = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
                       ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
 -                     if(duDb->ranFunction[ranFuncIdItem->ranFunctionID-1].id == ranFuncIdItem->ranFunctionID)
 +                     ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncIdItem->ranFunctionID);
 +                     if(ranFuncDb)
                       {
 -                        memset(&duDb->ranFunction[ranFuncIdItem->ranFunctionID-1], 0, sizeof(RanFunction));
 +                        memset(ranFuncDb, 0, sizeof(RanFunction));
                          duDb->numOfRanFunction--; 
                       }
  
@@@ -3054,9 -2953,9 +3054,9 @@@ uint8_t ProcRicSubscriptionFailure(uint
  {
     uint8_t ieIdx = 0, duIdx = 0, subsIdx = 0;
     uint8_t ranFuncId = 0;
 -   bool   ricReqIdDecoded = false;
     DuDb    *duDb = NULLP;
     RanFunction *ranFuncDb = NULLP;
 +   RicSubscription *ricSubs = NULLP;
     RicRequestId ricReqId;
     RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
  
                    {
                       ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
                       ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
 -                     ricReqIdDecoded = true;
                       break;
                    }
                    case ProtocolIE_IDE2_id_RANfunctionID:
                    {
                       ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
 -                     if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
 +                     ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
 +                     if(!ranFuncDb)
                       {
 -                        ranFuncDb = &duDb->ranFunction[ranFuncId-1];
 +                        DU_LOG("\nERROR  -->  E2AP : ProcRicSubscriptionFailure : RAN Function Id [%d] not found", ranFuncId);
 +                        return RFAILED;
 +                     }
 +                     else
 +                     {
 +                        /* Remove subscription entry from RAN Function */
 +                        ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb);
 +                        if(ricSubs)
 +                        {
 +                           memset(&ranFuncDb->subscriptionList[subsIdx], 0, sizeof(RicSubscription));
 +                        }
                       }
                       break; 
                    }
                    default:
                       /* No handling required as of now since this is a stub */
                       break;
 -
                 }
              }
           }
 +      }
 +   }
 +   return ROK;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Free memory for RIC Subscription Modification Confirm
 + *
 + * @details
 + *
 + *    Function : FreeRicSubsModConfirm
 + *
 + * Functionality: Free memory for RIC subscription modification
 + *    confirm
 + *
 + * @param E2AP Message PDU to be freed
 + * @return Void
 + *
 + ******************************************************************/
 +void FreeRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
 +{
 +   uint8_t ieIdx = 0, arrIdx=0;
 +   RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
 +   RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
 +   RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
 +   RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
 +   RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
 +   RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
  
 -         /* Remove subscription entry from RAN Function */
 -         if(ranFuncDb && ricReqIdDecoded)
 +   if(e2apMsg)
 +   {
 +      if(e2apMsg->choice.successfulOutcome)
 +      {
 +         ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
 +         if(ricSubsModCfm->protocolIEs.list.array)
           {
 -            for(subsIdx = 0; subsIdx < ranFuncDb->numOfSubscription; subsIdx++)
 +            for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
              {
 -               if((ranFuncDb->subscriptionList[subsIdx].requestId.requestorId == ricReqId.requestorId) &&
 -                     (ranFuncDb->subscriptionList[subsIdx].requestId.instanceId == ricReqId.instanceId))
 +               if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
                 {
 -                  memset(&ranFuncDb->subscriptionList[subsIdx], 0, sizeof(RicSubscription));
 -                  break;
 +                  ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +                  switch(ricSubsModCfmIe->id)
 +                  {
 +                     case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
 +                        {
 +                           modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
 +                           if(modCfmList->list.array)
 +                           {
 +                              for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
 +                              {
 +                                 RIC_FREE(modCfmList->list.array[arrIdx], \
 +                                    sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
 +                              }
 +                              RIC_FREE(modCfmList->list.array,  modCfmList->list.size);
 +                           }
 +                           break;
 +                        }
 +
 +                     case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
 +                        {
 +                           modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
 +                           if(modRefusedList->list.array)
 +                           {
 +                              for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
 +                              {
 +                                 RIC_FREE(modRefusedList->list.array[arrIdx], \
 +                                       sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
 +                              }
 +                              RIC_FREE(modRefusedList->list.array,  modRefusedList->list.size);
 +                           }
 +                           break;
 +                        }
 +
 +                     case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
 +                        {
 +                           rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
 +                           if(rmvCfmList->list.array)
 +                           {
 +                              for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
 +                              {
 +                                 RIC_FREE(rmvCfmList->list.array[arrIdx], \
 +                                       sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
 +                              }
 +                              RIC_FREE(rmvCfmList->list.array,  rmvCfmList->list.size);
 +                           }
 +                           break;
 +                        }
 +
 +                     case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
 +                        {
 +                           rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
 +                           if(rmvFailList->list.array)
 +                           {
 +                              for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
 +                              {
 +                                 RIC_ALLOC(rmvFailList->list.array[arrIdx], \
 +                                    sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
 +                              }
 +                              RIC_FREE(rmvFailList->list.array,  rmvFailList->list.size);
 +                           }
 +                           break;
 +                        }
 +
 +                     default:
 +                        break;
 +
 +                  }
 +                  RIC_FREE(ricSubsModCfmIe, sizeof(RICsubscriptionModificationConfirm_IEs_t));
                 }
              }
 +            RIC_FREE(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
 +         }
 +         RIC_FREE(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
 +      }
 +      RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
 +   }
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fill the list of actions confirmed for modification
 + *
 + * @details
 + *
 + *    Function : fillActionModConfirmedList
 + *
 + * Functionality: Fill the list of actions confirmed for modification
 + *
 + * @param List to be filled
 + *        Number of actions
 + *        Source list of actions
 + * @return ROK - success
 + *         RFAILED - failure
 + *
 + ******************************************************************/
 +uint8_t fillActionModConfirmedList(RICactions_ConfirmedForModification_List_t *modCfmList, uint8_t numActions, \
 +   uint8_t *actionModifiedList)
 +{
 +   uint8_t arrIdx = 0;
 +   RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
 +
 +   modCfmList->list.count = numActions;
 +   modCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForModification_ItemIEs_t *);
 +   RIC_ALLOC(modCfmList->list.array,  modCfmList->list.size);
 +   if(!modCfmList->list.array)
 +   {
 +      DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +      return RFAILED;
 +   }
 +
 +   for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
 +   {
 +      RIC_ALLOC(modCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
 +      if(!modCfmList->list.array[arrIdx])
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         return RFAILED;
 +      }
 +
 +      modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
 +      modCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForModification_Item;
 +      modCfmListItem->criticality = CriticalityE2_ignore;
 +      modCfmListItem->value.present = \
 +         RICaction_ConfirmedForModification_ItemIEs__value_PR_RICaction_ConfirmedForModification_Item;
 +      modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID = actionModifiedList[arrIdx];
 +   }
 +
 +   return ROK;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fill the list of actions refused to be modified
 + *
 + * @details
 + *
 + *    Function : fillActionModRefusedList
 + *
 + * Functionality: Fill the list of actions refused to be modified
 + *
 + * @param List to be filled
 + *        Number of list
 + *        Source list of actions refused tobe modified
 + * @return ROK - success
 + *         RFAILED - failure
 + *
 + ******************************************************************/
 +uint8_t fillActionModRefusedList(RICactions_RefusedToBeModified_List_t *modRefusedList, uint8_t numActions, \
 +   ActionFailed *actionModFailedList)
 +{
 +   uint8_t arrIdx = 0;
 +   RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
 +
 +   modRefusedList->list.count = numActions;
 +   modRefusedList->list.size = numActions * sizeof(RICaction_RefusedToBeModified_ItemIEs_t *);
 +   RIC_ALLOC(modRefusedList->list.array,  modRefusedList->list.size);
 +   if(!modRefusedList->list.array)
 +   {
 +      DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +      return RFAILED;
 +   }
 +
 +   for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
 +   {
 +      RIC_ALLOC(modRefusedList->list.array[arrIdx], sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
 +      if(!modRefusedList->list.array[arrIdx])
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         return RFAILED;
 +      }
 +
 +      modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
 +      modRefusedListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeModified_Item;
 +      modRefusedListItem->criticality = CriticalityE2_ignore;
 +      modRefusedListItem->value.present = \
 +         RICaction_RefusedToBeModified_ItemIEs__value_PR_RICaction_RefusedToBeModified_Item;
 +      modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID = \
 +         actionModFailedList[arrIdx].actionId;
 +      fillE2FailureCause(&modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.cause, \
 +         actionModFailedList[arrIdx].failureType, actionModFailedList[arrIdx].cause);
 +   }
 +
 +   return ROK;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fill the list of action confirmed for removal
 + *
 + * @details
 + *
 + *    Function : fillActionRemovalConfirmedList
 + *
 + * Functionality: Fill the list of action confirmed for removal
 + *
 + * @param List to be filled
 + *        Number of actions
 + *        Source list of actions removed
 + * @return ROK - success
 + *         RFAILED - failure
 + *
 + ******************************************************************/
 +uint8_t fillActionRemovalConfirmedList(RICactions_ConfirmedForRemoval_List_t *rmvCfmList, uint8_t numActions, \
 +   uint8_t *actionRemovedList)
 +{
 +   uint8_t arrIdx = 0;
 +   RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
 +
 +   rmvCfmList->list.count = numActions;
 +   rmvCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t *);
 +   RIC_ALLOC(rmvCfmList->list.array,  rmvCfmList->list.size);
 +   if(!rmvCfmList->list.array)
 +   {
 +      DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +      return RFAILED;
 +   }
 +
 +   for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
 +   {
 +      RIC_ALLOC(rmvCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
 +      if(!rmvCfmList->list.array[arrIdx])
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         return RFAILED;
 +      }
 +
 +      rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
 +      rmvCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForRemoval_Item;
 +      rmvCfmListItem->criticality = CriticalityE2_ignore;
 +      rmvCfmListItem->value.present = \
 +         RICaction_ConfirmedForRemoval_ItemIEs__value_PR_RICaction_ConfirmedForRemoval_Item;
 +      rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID = actionRemovedList[arrIdx];
 +   }
 +
 +   return ROK;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Fill the list of actions refused to be removed
 + *
 + * @details
 + *
 + *    Function : fillActionRemovalRefusedList
 + *
 + * Functionality: Fill the list of actions refused to be removed
 + *
 + * @param List to be filled
 + *        Number of list
 + *        Source list of actions refused to be removed
 + * @return ROK - success
 + *         RFAILED - failure
 + *
 + ******************************************************************/
 +uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFailList, \
 +   uint8_t numActions, ActionFailed *actionRmvlFailList)
 +{
 +   uint8_t arrIdx = 0;
 +   RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
 +
 +   rmvFailList->list.count = numActions;
 +   rmvFailList->list.size = numActions * sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t *);
 +   RIC_ALLOC(rmvFailList->list.array,  rmvFailList->list.size);
 +   if(!rmvFailList->list.array)
 +   {
 +      DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +      return RFAILED;
 +   }
 +
 +   for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
 +   {
 +      RIC_ALLOC(rmvFailList->list.array[arrIdx], sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
 +      if(!rmvFailList->list.array[arrIdx])
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         return RFAILED;
 +      }
 +
 +      rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
 +      rmvFailListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeRemoved_Item;
 +      rmvFailListItem->criticality = CriticalityE2_ignore;
 +      rmvFailListItem->value.present = \
 +         RICaction_RefusedToBeRemoved_ItemIEs__value_PR_RICaction_RefusedToBeRemoved_Item;
 +      rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID = actionRmvlFailList[arrIdx].actionId;
 +      fillE2FailureCause(&rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.cause, \
 +         actionRmvlFailList[arrIdx].failureType, actionRmvlFailList[arrIdx].cause);
 +   }
 +
 +   return ROK;
 +
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Build And Send RIC Subscription Modification Refuse
 + *
 + * @details
 + *
 + *    Function : BuildAndSendRicSubsModRefuse
 + *
 + * Functionality: Build And Send RIC Subscription Modification Refuse
 + *
 + * @param DU ID
 + *        RIC Request ID of subscription
 + *        RAN Function ID
 + *        Type of failure
 + *        Cause of failure
 + * @return ROK - success
 + *         RFAILED - failure
 + *
 + ******************************************************************/
 +uint8_t BuildAndSendRicSubsModConfirm(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, RicTmpActionList tmpActionList)
 +{
 +   uint8_t ieIdx = 0, elementCnt = 0;
 +   uint8_t ret = RFAILED;
 +   E2AP_PDU_t *e2apMsg = NULLP;
 +   asn_enc_rval_t encRetVal;
 +   RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
 +   RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
 +
 +   DU_LOG("\nINFO   -->  E2AP : Building RIC Subscription Modification Confirm\n");
 +   while(true)
 +   {
 +      RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
 +      if(e2apMsg == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         break;
 +      }
 +
 +      /* Successful Outcome */
 +      e2apMsg->present =  E2AP_PDU_PR_successfulOutcome;
 +      RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
 +      if(e2apMsg->choice.successfulOutcome == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         break;
 +      }
 +
 +      e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
 +      e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
 +      e2apMsg->choice.successfulOutcome->value.present = \
 +         SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm;
 +      ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
 +
 +      elementCnt = 2;
 +      if(tmpActionList.numActionModified)
 +         elementCnt++;
 +      if(tmpActionList.numActionModFailed)
 +         elementCnt++;
 +      if(tmpActionList.numActionRemoved)
 +         elementCnt++;
 +      if(tmpActionList.numActionRemovalFailed)
 +         elementCnt++;
 +
 +      ricSubsModCfm->protocolIEs.list.count = elementCnt;
 +      ricSubsModCfm->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationConfirm_IEs_t *);
 +      RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
 +      if(!ricSubsModCfm->protocolIEs.list.array)
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +         break;
 +      }
 +
 +      for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
 +      {
 +         RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationConfirm_IEs_t));
 +         if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
 +         {
 +            DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
 +            break;
 +         }
 +      }
 +      
 +      /* RIC Request ID */
 +      ieIdx = 0;
 +      ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +      ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICrequestID;
 +      ricSubsModCfmIe->criticality = CriticalityE2_reject;
 +      ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RICrequestID;
 +      ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
 +      ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
 +
 +      /* RAN Function ID */
 +      ieIdx++;
 +      ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +      ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RANfunctionID;
 +      ricSubsModCfmIe->criticality = CriticalityE2_reject;
 +      ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RANfunctionID;
 +      ricSubsModCfmIe->value.choice.RANfunctionID = ranFuncId;
 +
 +      /* RIC Actions List confirmed for modification */
 +      if(tmpActionList.numActionModified)
 +      {
 +         ieIdx++;
 +         ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +         ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List;
 +         ricSubsModCfmIe->criticality = CriticalityE2_ignore;
 +         ricSubsModCfmIe->value.present = \
 +            RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForModification_List;
 +         if(fillActionModConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List, \
 +            tmpActionList.numActionModified, tmpActionList.actionModifiedList) != ROK)
 +         {
 +            DU_LOG("\nERROR  -->  E2AP : %s: Failed to fill RIC Actions Confirmed for Modification List", __func__);
 +            break;
 +         }
 +      }
 +
 +      /* RIC Actions List refured to be modified */
 +      if(tmpActionList.numActionModFailed)
 +      {
 +         ieIdx++;
 +         ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +         ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List;
 +         ricSubsModCfmIe->criticality = CriticalityE2_ignore;
 +         ricSubsModCfmIe->value.present = \
 +            RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeModified_List;
 +         if(fillActionModRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List, \
 +            tmpActionList.numActionModFailed, tmpActionList.actionModFailedList) != ROK)
 +         {
 +            DU_LOG("\nERROR  -->  E2AP : %s: Failed to fill RIC Actions Refused to be Modified List", __func__);
 +            break;
 +         }
 +      }
 +
 +      /* RIC Actions List confirmed for removal */
 +      if(tmpActionList.numActionRemoved)
 +      {
 +         ieIdx++;
 +         ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +         ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List;
 +         ricSubsModCfmIe->criticality = CriticalityE2_ignore;
 +         ricSubsModCfmIe->value.present = \
 +            RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForRemoval_List;
 +         if(fillActionRemovalConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List, \
 +            tmpActionList.numActionRemoved, tmpActionList.actionRemovedList) != ROK)
 +         {
 +            DU_LOG("\nERROR  -->  E2AP : %s: Failed to fill RIC Actions Confirmed for Removal List", __func__);
 +            break;
 +         }
 +      }
 +
 +      /* RIC Actions List Refused to be removed */
 +      if(tmpActionList.numActionRemovalFailed)
 +      {
 +         ieIdx++;
 +         ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
 +         ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List;
 +         ricSubsModCfmIe->criticality = CriticalityE2_ignore;
 +         ricSubsModCfmIe->value.present = \
 +            RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeRemoved_List;
 +         if(fillActionRemovalRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List, \
 +            tmpActionList.numActionRemovalFailed, tmpActionList.actionRemovalFailedList) != ROK)
 +         {
 +            DU_LOG("\nERROR  -->  E2AP : %s: Failed to fill RIC Actions Failed to be Removed List", __func__);
 +            break;
 +         }
 +      }
 +
 +      /* Print and encode E2AP Message PDU */
 +      xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
 +      memset(encBuf, 0, ENC_BUF_MAX_LEN);
 +      encBufSize = 0;
 +      encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
 +
 +      /* Check encode results */
 +      if(encRetVal.encoded == ENCODE_FAIL)
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Could not encode RIC subscription modification confirm (at %s)\n",\
 +               encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
 +         break;
 +      }
 +      else
 +      {
 +         DU_LOG("\nDEBUG  -->  E2AP : Created APER encoded buffer for RIC subscription modification confirm\n");
 +         for(int i=0; i< encBufSize; i++)
 +         {
 +            DU_LOG("%x",encBuf[i]);
           }
        }
 +
 +      if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
 +      {
 +         DU_LOG("\nERROR  -->  E2AP : Failed to send RIC Subscription Modification Confirm");
 +         break;
 +      }
 +
 +      ret =ROK;
 +      break;
 +   }
 +
 +   FreeRicSubsModConfirm(e2apMsg);
 +   return ret;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Processing of RIC Subscription Modification Required
 + *
 + * @details
 + *
 + *    Function : ProcRicSubsModReqd
 + *
 + * Functionality: Processing of RIC Subscription Modification Required
 + *    As of now, we do not identify any scenario where this message
 + *    shall be sent by DU. Hence, bare minimum handling has been
 + *    done here.
 + *
 + * @param  DU ID
 + *         RIC Subscription Modification Required IEs
 + * @return ROK-success
 + *         RFAILED-failure
 + *
 + ******************************************************************/
 +uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t *ricSubsModReqd)
 +{
 +   uint8_t ieIdx = 0, actionIdx = 0, duIdx = 0;
 +   DuDb    *duDb = NULLP;
 +   uint16_t ranFuncId;
 +   uint16_t actionId;
 +   RicRequestId ricReqId;
 +   RanFunction *ranFuncDb = NULLP;
 +   RicSubscription *ricSubs = NULLP;
 +   ActionInfo *action = NULLP;
 +   RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
 +   RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
 +   RICactions_RequiredToBeRemoved_List_t  *actionToBeRmvList = NULLP;
 +   RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULLP;
 +   RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULLP;
 +   RicTmpActionList tmpActionList;
 +
 +   memset(&ricReqId, 0, sizeof(RicRequestId));
 +   memset(&tmpActionList, 0, sizeof(RicTmpActionList));
 +
 +   SEARCH_DU_DB(duIdx, duId, duDb);
 +   if(duDb == NULLP)
 +   {
 +      DU_LOG("\nERROR  -->  E2AP : duDb is not present for duId %d",duId);
 +      return RFAILED;
 +   }
 +
 +   for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
 +   {
 +      ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
 +      switch(ricSubsModReqdIe->id)
 +      {
 +         case ProtocolIE_IDE2_id_RICrequestID:
 +            {
 +               ricReqId.requestorId = ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID;
 +               ricReqId.instanceId = ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID;
 +               break;
 +            }
 +         case ProtocolIE_IDE2_id_RANfunctionID:
 +            {
 +               ranFuncId = ricSubsModReqdIe->value.choice.RANfunctionID;
 +               ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
 +               if(!ranFuncDb)
 +               {
 +                  /* If RIC Subscription not found, send RIC Subscription modification refuse to DU */
 +                  DU_LOG("\nERROR  -->  E2AP : ProcRicSubsModReqd: RIC Subscription not found");
 +                  //BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
 +                     CauseE2RICrequest_request_id_unknown);
 +                  return RFAILED;
 +               }
 +
 +               ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb);
 +               if(!ricSubs)
 +               {
 +                  /* If RAN Function not found, send RIC Subscription modification refuse to DU */
 +                  DU_LOG("\nERROR  -->  E2AP : ProcRicSubsModReqd: RAN Function ID [%d] not found",ranFuncId);
 +                  //BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
 +                     CauseE2_PR_ricRequest, CauseE2RICrequest_ran_function_id_invalid);
 +                  return RFAILED; 
 +               }
 +               break;
 +            }
 +         case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
 +            {
 +               actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
 +               for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++)
 +               {
 +                  actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx];
 +                  actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID;
 +                  action = fetchActionInfoFromActionId(actionId, ricSubs);
 +                  if(action)
 +                  {
 +                     /* No modification required as of now, hence directly adding to the list */
 +                     tmpActionList.actionModifiedList[tmpActionList.numActionModified++] = actionId;
 +                  }
 +                  else
 +                  {
 +                     tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].actionId = actionId;
 +                     tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].failureType = \
 +                        CauseE2_PR_ricRequest;
 +                     tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].cause = \
 +                        CauseE2RICrequest_action_not_supported;
 +                     tmpActionList.numActionModFailed++;
 +                  }
 +               }
 +               break;
 +            }
 +         case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
 +            {
 +               actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
 +               for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++)
 +               {
 +                  actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx];
 +                  actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID;
 +                  action = fetchActionInfoFromActionId(actionId, ricSubs);
 +                  if(action)
 +                  {
 +                     tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId;
 +                     memset(action, 0, sizeof(ActionInfo));
 +                     action->actionId = -1;
 +                     ricSubs->numOfActions--;
 +                  }
 +               }
 +               break;
 +            }
 +         default:
 +            break;
 +      }
     }
 +
 +   /* If none of the action modification/removal is supported, 
 +    *   send RIC Subscription Modification Refuse
 +    * Else
 +    *   send RIC Subscription Modification Confirm
 +    */
 +   if(tmpActionList.numActionModified || tmpActionList.numActionRemoved)
 +   {
 +      BuildAndSendRicSubsModConfirm(duId, ricReqId, ranFuncId, tmpActionList);
 +   }
 +   else
 +   {
 +      // TO BE DONE IN FUTURE GERRITS
 +      //BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
 +      CauseE2RICrequest_action_not_supported);
 +   }
 +   
     return ROK;
  }
  
@@@ -3993,6 -3218,176 +3993,176 @@@ uint8_t BuildAndSendErrorIndication(uin
     return ret;
  }
  
+ /*******************************************************************
+  *
+  * @brief Deallocate the memory allocated for ResetRequest msg
+  *
+  * @details
+  *
+  *    Function : FreeResetRequest
+  *
+  *    Functionality:
+  *       - freeing the memory allocated for ResetRequest
+  *
+  * @params[in] E2AP_PDU_t *e2apMsg
+  * @return ROK     - success
+  *         RFAILED - failure
+  *
+  * ****************************************************************/
+ void FreeResetRequest(E2AP_PDU_t *e2apMsg)
+ {
+    uint8_t ieIdx =0;
+    ResetRequestE2_t  *resetReq = NULLP;
+    if(e2apMsg != NULLP)
+    {
+       if(e2apMsg->choice.initiatingMessage != NULLP)
+       {
+          resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
+          if(resetReq->protocolIEs.list.array)
+          {
+             for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
+             {
+                RIC_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
+             }
+             RIC_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
+          }
+          RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
+       }
+       RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
+    }
+ }
+ /*******************************************************************
+  *
+  * @brief Build and send the reset request msg
+  *
+  * @details
+  *
+  *    Function : BuildAndSendResetRequest
+  *
+  *    Functionality:
+  *         - Buld and send the reset request msg to E2 node
+  *
+  * @params[in]
+  *    DU database
+  *    Type of failure 
+  *    Cause of failure
+  * @return ROK     - success
+  *         RFAILED - failure
+  *
+  * ****************************************************************/
+ uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t reason)
+ {
+    uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
+    uint8_t ret = RFAILED;
+    E2AP_PDU_t        *e2apMsg = NULLP;
+    ResetRequestE2_t  *resetReq = NULLP;
+    asn_enc_rval_t     encRetVal;       /* Encoder return value */
+    DU_LOG("\nINFO   -->  E2AP : Building Reset Request\n");
+    do
+    {
+       RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
+       if(e2apMsg == NULLP)
+       {
+          DU_LOG("\nERROR  -->  E2AP : BuildAndSendResetRequest(): Memory allocation for E2AP-PDU failed");
+          break;
+       }
+       e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
+       RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
+       if(e2apMsg->choice.initiatingMessage == NULLP)
+       {
+          DU_LOG("\nERROR  -->  E2AP : BuildAndSendResetRequest(): Memory allocation for initiatingMessage");
+          break;
+       }
+       e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
+       e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
+       e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
+       resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
+       elementCnt = 2;
+       resetReq->protocolIEs.list.count = elementCnt;
+       resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
+       RIC_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
+       if(!resetReq->protocolIEs.list.array)
+       {
+          DU_LOG("\nERROR  -->  E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
+                Reset Request IE array");
+          break;
+       }
+       for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
+       {
+          RIC_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
+          if(!resetReq->protocolIEs.list.array[ieIdx])
+          {
+             DU_LOG("\nERROR  -->  E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
+                   Reset Request IE array element");
+             break;
+          }
+       }
+       /* In case of failure */
+       if(ieIdx < elementCnt)
+          break;
+       ieIdx = 0;
+       resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
+       resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
+       resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
+       transId = assignTransactionId(duDb);
+       resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
+       ieIdx++;
+       resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
+       resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
+       resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
+       fillE2FailureCause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
+       /* Prints the Msg formed */
+       xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
+       memset(encBuf, 0, ENC_BUF_MAX_LEN);
+       encBufSize = 0;
+       encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
+             encBuf);
+       if(encRetVal.encoded == ENCODE_FAIL)
+       {
+          DU_LOG("\nERROR  -->  E2AP : Could not encode reset request structure (at %s)\n",\
+                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+          break;
+       }
+       else
+       {
+          DU_LOG("\nDEBUG   -->  E2AP : Created APER encoded buffer for reset request\n");
+ #ifdef DEBUG_ASN_PRINT
+          for(int i=0; i< encBufSize; i++)
+          {
+             printf("%x",encBuf[i]);
+          }
+ #endif
+       }
+       if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
+       {
+          DU_LOG("\nERROR  -->  E2AP : Sending reset request failed");
+          break;
+       }
+       ret = ROK;
+       break;
+    }while(true);
+    /* Free all memory */
+    FreeResetRequest(e2apMsg);
+    return ret;
+ }
  /*******************************************************************
  *
  * @brief Handles received E2AP message and sends back response  
@@@ -4094,14 -3489,6 +4264,14 @@@ void E2APMsgHdlr(uint32_t *duId, Buffe
                       ProcRicServiceUpdate(*duId,  &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
                       break;
                    }
 +               case InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired:
 +                  {
 +                     DU_LOG("\nINFO  -->  E2AP : RIC Subscription Modification Required");
 +                     ProcRicSubsModReqd(*duId, \
 +                           &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired);
 +                     break;
 +                  }
 +
                 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
                    {
                       DU_LOG("\nINFO  -->  E2AP : Error indication received");