[Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] RIC Subscription Modification failure 69/12069/2
authorpborla <pborla@radisys.com>
Tue, 21 Nov 2023 10:50:33 +0000 (16:20 +0530)
committerpborla <pborla@radisys.com>
Wed, 22 Nov 2023 08:49:54 +0000 (14:19 +0530)
Change-Id: I7c8e662448311bd8e8ea8862d41f36e9faca8061
Signed-off-by: pborla <pborla@radisys.com>
src/du_app/du_e2ap_msg_hdl.c
src/ric_stub/ric_e2ap_msg_hdl.c

index fe44624..593fd3d 100644 (file)
@@ -7639,6 +7639,7 @@ uint8_t BuildAndSendRicSubscriptionDeleteFailure(uint16_t ranFuncId,  RicRequest
       ricSubsDelFailureIe->value.choice.RANfunctionID = ranFuncId;
       
       ieIdx++;
+      ricSubsDelFailureIe = ricSubsDelFailure->protocolIEs.list.array[ieIdx];
       ricSubsDelFailureIe->id = ProtocolIE_IDE2_id_CauseE2;
       ricSubsDelFailureIe->criticality = CriticalityE2_ignore;
       ricSubsDelFailureIe->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_CauseE2;
@@ -9706,6 +9707,175 @@ void procRicSubscriptionModificationRequest(E2AP_PDU_t *e2apMsg)
    freeAperDecodingOfRicSubsModificationReq(e2apMsg);
 }
 
+/*******************************************************************
+ * @brief Free RIC Subscription Modification Failure Message
+ *
+ * @details
+ *
+ *    Function : FreeRicSubscriptionModificationFailure
+ *
+ * Functionality:  Free RIC Subscription Modification Failure
+ *
+ * @param  E2AP Message PDU
+ * @return void
+ *
+ ******************************************************************/
+void FreeRicSubscriptionModificationFailure(E2AP_PDU_t *e2apMsg)
+{
+   uint8_t ieIdx = 0;
+   RICsubscriptionModificationFailure_t *ricSubsModFailure = NULLP;
+
+   if(e2apMsg)
+   {
+      if(e2apMsg->choice.unsuccessfulOutcome)
+      {
+         ricSubsModFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationFailure;
+         if(ricSubsModFailure->protocolIEs.list.array)
+         {
+            for(ieIdx = 0; ieIdx < ricSubsModFailure->protocolIEs.list.count; ieIdx++)
+            {
+               DU_FREE(ricSubsModFailure->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationFailure_IEs_t));
+            }
+            DU_FREE(ricSubsModFailure->protocolIEs.list.array, ricSubsModFailure->protocolIEs.list.size);
+         }
+         DU_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
+      }
+      DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));;
+   }
+}
+/*******************************************************************
+ *
+ * @brief Builds and Send RIC Subscription Modification Failure
+ *
+ * @details
+ *
+ *    Function : BuildAndSendRicSubscriptionModificationFailure
+ *
+ * Functionality: Build and send RIC Subscription Modification Failure.
+ *
+ * @params[in]
+ *          Ran Func Id
+ *          Ric Req Id
+ *          E2 failure cause
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ ******************************************************************/
+uint8_t BuildAndSendRicSubscriptionModificationFailure(uint16_t ranFuncId,  RicRequestId requestId, E2FailureCause failureCause)
+{
+   uint8_t elementCnt = 0, ieIdx = 0, ret = RFAILED;
+   E2AP_PDU_t         *e2apMsg = NULLP;
+   RICsubscriptionModificationFailure_t *ricSubsModFailure = NULLP;
+   RICsubscriptionModificationFailure_IEs_t *ricSubsModFailureIe = NULLP;
+   asn_enc_rval_t     encRetVal;        /* Encoder return value */
+
+   while(true)
+   {
+      DU_LOG("\nINFO   -->  E2AP : Building RIC Subscription Modification Failure Message\n");
+
+      DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
+      if(e2apMsg == NULLP)
+      {
+         DU_LOG("\nERROR  -->  E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
+         break;
+      }
+
+      e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
+      DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
+      if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
+      {
+         DU_LOG("\nERROR  -->  E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
+         break;
+      }
+      e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModification;
+      e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
+      e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationFailure;
+
+
+      ricSubsModFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationFailure;
+
+      elementCnt = 3;
+      ricSubsModFailure->protocolIEs.list.count = elementCnt;
+      ricSubsModFailure->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationFailure_IEs_t *);
+
+      DU_ALLOC(ricSubsModFailure->protocolIEs.list.array, ricSubsModFailure->protocolIEs.list.size);
+      if(ricSubsModFailure->protocolIEs.list.array == NULLP)
+      {
+         DU_LOG("\nERROR  -->  E2AP : %s: Memory allocation failed for array elements at line %d",__func__, __LINE__);
+         break;
+      }
+
+      for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
+      {
+         DU_ALLOC(ricSubsModFailure->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationFailure_IEs_t));
+         if(ricSubsModFailure->protocolIEs.list.array[ieIdx] == NULLP)
+         {
+            DU_LOG("\nERROR  -->  E2AP : %s: Memory allocation failed for index [%d] at line %d", \
+                  __func__, ieIdx, __LINE__);
+            break;
+         }
+      }
+      if(ieIdx < elementCnt)
+         break;
+
+      ieIdx = 0;
+      ricSubsModFailureIe = ricSubsModFailure->protocolIEs.list.array[ieIdx];
+      ricSubsModFailureIe->id = ProtocolIE_IDE2_id_RICrequestID;
+      ricSubsModFailureIe->criticality = CriticalityE2_reject;
+      ricSubsModFailureIe->value.present = RICsubscriptionModificationFailure_IEs__value_PR_RICrequestID;
+      ricSubsModFailureIe->value.choice.RICrequestID.ricRequestorID= requestId.requestorId;
+      ricSubsModFailureIe->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
+
+      ieIdx++;
+      ricSubsModFailureIe = ricSubsModFailure->protocolIEs.list.array[ieIdx];
+      ricSubsModFailureIe->id = ProtocolIE_IDE2_id_RANfunctionID;
+      ricSubsModFailureIe->criticality = CriticalityE2_reject;
+      ricSubsModFailureIe->value.present = RICsubscriptionModificationFailure_IEs__value_PR_RANfunctionID;
+      ricSubsModFailureIe->value.choice.RANfunctionID = ranFuncId;
+
+      ieIdx++;
+      ricSubsModFailureIe = ricSubsModFailure->protocolIEs.list.array[ieIdx];
+      ricSubsModFailureIe->id = ProtocolIE_IDE2_id_CauseE2;
+      ricSubsModFailureIe->criticality = CriticalityE2_reject;
+      ricSubsModFailureIe->value.present = RICsubscriptionModificationFailure_IEs__value_PR_CauseE2;
+      fillE2Cause(&ricSubsModFailureIe->value.choice.CauseE2, failureCause);
+
+      /* 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 RIC Subscription Modification Failure Message (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 Failure Message \n");
+#ifdef DEBUG_ASN_PRINT
+         for(int i=0; i< encBufSize; i++)
+         {
+            printf("%x",encBuf[i]);
+         }
+#endif
+      }
+
+      if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
+      {
+         DU_LOG("\nERROR   -->  E2AP : Failed to send RIC Susbcription Modification Failure Message");
+         break;
+      }
+
+      ret = ROK;
+      break;
+   }
+
+   FreeRicSubscriptionModificationFailure(e2apMsg);
+   return ret;
+}
+
 /*******************************************************************
  *
  * @brief Handles received E2AP message and sends back response  
index 025f076..8ca54de 100644 (file)
@@ -7220,6 +7220,78 @@ void ProcRicSubsDeleteRsp(uint32_t duId, RICsubscriptionDeleteResponse_t *ricSub
    }
 }
 
+
+ /******************************************************************
+  *
+  * @brief Processes the Ric Subs modification failure msg
+  *
+  * @details
+  *
+  *    Function : procRicSubsModificationFailure
+  *
+  *    Functionality: Processes the Ric Subs modification failure msg
+  *
+  * @params[in]
+  *       Ric Subs modification failure information
+  *
+  * @return void
+  *
+  * ****************************************************************/
+ void ProcRicSubsModificationFailure(RICsubscriptionModificationFailure_t *ricSubsModificationFail)
+ {
+    uint8_t ieIdx = 0;
+    uint16_t ranFuncId=0;
+    CauseE2_t *cause = NULLP;
+    RICrequestID_t  ricRequestID;
+
+    DU_LOG("\nINFO  -->  E2AP : Ric subscription modification failure received");
+
+    if(!ricSubsModificationFail)
+    {
+       DU_LOG("\nERROR  -->  E2AP : ricSubsModificationFail pointer is null");
+       return;
+    }
+
+    if(!ricSubsModificationFail->protocolIEs.list.array)
+    {
+       DU_LOG("\nERROR  -->  E2AP : ricSubsModificationFail array pointer is null");
+       return;
+    }
+
+    for(ieIdx=0; ieIdx < ricSubsModificationFail->protocolIEs.list.count; ieIdx++)
+    {
+       if(ricSubsModificationFail->protocolIEs.list.array[ieIdx])
+       {
+          switch(ricSubsModificationFail->protocolIEs.list.array[ieIdx]->id)
+          {
+             case ProtocolIE_IDE2_id_RICrequestID:
+                {
+                   memcpy(&ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID, &ricRequestID, sizeof(RICrequestID_t));
+                   DU_LOG("\nERROR  -->  E2AP : Received RicReqId %ld and InstanceId %ld", ricRequestID.ricRequestorID, ricRequestID.ricInstanceID);
+                   break;
+                }
+             case ProtocolIE_IDE2_id_RANfunctionID:
+                {
+                   ranFuncId = ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
+                   DU_LOG("\nERROR  -->  E2AP : Received ranfuncId %d", ranFuncId);
+                   break;
+                }
+             case ProtocolIE_IDE2_id_CauseE2:
+                {
+                    cause = &ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
+                    printE2ErrorCause(cause);
+                    break;
+                }
+             default:
+                {
+                   DU_LOG("\nERROR  -->  E2AP : Received Invalid Ie [%ld]", ricSubsModificationFail->protocolIEs.list.array[ieIdx]->id);
+                   break;
+                }
+          }
+       }
+    }
+ }
+
 /*******************************************************************
  *
  * @brief Free RIC Subscription  action to be added list
@@ -8019,6 +8091,11 @@ void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
                      ProcRicSubsDeleteFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionDeleteFailure);
                      break;
                   }
+               case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationFailure:
+                  {
+                     ProcRicSubsModificationFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationFailure);
+                     break;
+                  }
                default:
                   {
                      DU_LOG("\nERROR  -->  E2AP : Invalid type of unsuccessfulOutcome message [%d]", \