From: pborla Date: Tue, 21 Nov 2023 10:50:33 +0000 (+0530) Subject: [Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] RIC Subscription Modification failure X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=7be3f80c289304edaa42f6f46a30015aad04747a;p=o-du%2Fl2.git [Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-530] RIC Subscription Modification failure Change-Id: I7c8e662448311bd8e8ea8862d41f36e9faca8061 Signed-off-by: pborla --- diff --git a/src/du_app/du_e2ap_msg_hdl.c b/src/du_app/du_e2ap_msg_hdl.c index fe4462497..593fd3d8a 100644 --- a/src/du_app/du_e2ap_msg_hdl.c +++ b/src/du_app/du_e2ap_msg_hdl.c @@ -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 diff --git a/src/ric_stub/ric_e2ap_msg_hdl.c b/src/ric_stub/ric_e2ap_msg_hdl.c index 025f07668..8ca54deca 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.c +++ b/src/ric_stub/ric_e2ap_msg_hdl.c @@ -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]", \