Merge "[Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-531] RIC Subscription Modification...
authorHarshita Lal <harshita.lal@radisys.com>
Fri, 6 Oct 2023 07:03:33 +0000 (07:03 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Fri, 6 Oct 2023 07:03:33 +0000 (07:03 +0000)
1  2 
src/ric_stub/ric_e2ap_msg_hdl.c

@@@ -3119,6 -3119,175 +3119,175 @@@ uint8_t ProcRicSubscriptionFailure(uint
     return ROK;
  }
  
+ /*******************************************************************
+  *
+  * @brief Free RIC Subscription Modification Refuse
+  *
+  * @details
+  *
+  *    Function : FreeRicSubsModRefuse
+  *
+  * Functionality: Free RIC Subscription Modification Refuse
+  *
+  * @param  E2AP Message PDU to be freed
+  * @return void
+  *
+  ******************************************************************/
+ void FreeRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
+ {
+    uint8_t ieIdx =0;
+    RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
+    if(e2apMsg)
+    {
+       if(e2apMsg->choice.unsuccessfulOutcome)
+       {
+          ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
+          if(ricSubsModRefuse->protocolIEs.list.array)
+          {
+             for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
+             {
+                RIC_FREE(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
+             }
+             RIC_FREE(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
+          }
+          RIC_FREE(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
+       }
+       RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
+    }
+ }
+ /*******************************************************************
+  *
+  * @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 BuildAndSendRicSubsModRefuse(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, CauseE2_PR causeType, \
+    uint8_t cause)
+ {
+    uint8_t ieIdx = 0, elementCnt = 0;
+    uint8_t ret = RFAILED;
+    E2AP_PDU_t *e2apMsg = NULL;
+    asn_enc_rval_t encRetVal;
+    RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
+    RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
+    DU_LOG("\nINFO   -->  E2AP : Building RIC Subscription Modification Refuse\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;
+       }
+       e2apMsg->present =  E2AP_PDU_PR_unsuccessfulOutcome;
+       RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
+       if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
+       {
+          DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
+          break;
+       }
+       e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
+       e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
+       e2apMsg->choice.unsuccessfulOutcome->value.present = \
+          UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse;
+       ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
+       elementCnt = 3;
+       ricSubsModRefuse->protocolIEs.list.count = elementCnt;
+       ricSubsModRefuse->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRefuse_IEs_t *);
+       RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
+       if(!ricSubsModRefuse->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(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
+          if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
+          {
+             DU_LOG("\nERROR  -->  E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
+             break;
+          }
+       }
+       
+       /* RIC Request ID */
+       ieIdx = 0;
+       ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
+       ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RICrequestID;
+       ricSubsModRefuseIe->criticality = CriticalityE2_reject;
+       ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RICrequestID;
+       ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
+       ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
+       /* RAN Function ID */
+       ieIdx++;
+       ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
+       ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RANfunctionID;
+       ricSubsModRefuseIe->criticality = CriticalityE2_reject;
+       ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RANfunctionID;
+       ricSubsModRefuseIe->value.choice.RANfunctionID = ranFuncId;
+       /* Cause */
+       ieIdx++;
+       ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
+       ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_CauseE2;
+       ricSubsModRefuseIe->criticality = CriticalityE2_reject;
+       ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_CauseE2;
+       fillE2FailureCause(&ricSubsModRefuseIe->value.choice.CauseE2, causeType, cause); 
+       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 refuse (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 refuse\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 Refused");
+          break;
+       }
+       ret =ROK;
+       break;
+    }
+    FreeRicSubsModRefuse(e2apMsg);
+    return ret;
+ }
  /*******************************************************************
   *
   * @brief Free memory for RIC Subscription Modification Confirm
@@@ -3449,19 -3618,18 +3618,18 @@@ uint8_t fillActionRemovalRefusedList(RI
  
  /*******************************************************************
   *
-  * @brief Build And Send RIC Subscription Modification Refuse
+  * @brief Build And Send RIC Subscription Modification Confirm
   *
   * @details
   *
-  *    Function : BuildAndSendRicSubsModRefuse
+  *    Function : BuildAndSendRicSubsModConfirm
   *
-  * Functionality: Build And Send RIC Subscription Modification Refuse
+  * Functionality: Build And Send RIC Subscription Modification Confirm
   *
   * @param DU ID
   *        RIC Request ID of subscription
   *        RAN Function ID
-  *        Type of failure
-  *        Cause of failure
+  *        Temporary source action list
   * @return ROK - success
   *         RFAILED - failure
   *
@@@ -3715,8 -3883,8 +3883,8 @@@ uint8_t ProcRicSubsModReqd(uint32_t duI
                 {
                    /* 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);
+                   BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
+                      CauseE2RICrequest_ran_function_id_invalid);
                    return RFAILED;
                 }
  
                 {
                    /* 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);
+                   BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
+                      CauseE2_PR_ricRequest, CauseE2RICrequest_request_id_unknown);
                    return RFAILED; 
                 }
                 break;
     }
     else
     {
-       // TO BE DONE IN FUTURE GERRITS
-       //BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
-       CauseE2RICrequest_action_not_supported);
+       BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
+             CauseE2RICrequest_action_not_supported);
     }
     
     return ROK;
@@@ -3993,176 -4160,6 +4160,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