From 349ce6153f82d03f3ec90e2450788ea15abe05ed Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Thu, 5 Oct 2023 15:30:37 +0530 Subject: [PATCH] [Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-531] RIC Subscription Modification Refuse Change-Id: Ic69501796d4d90b52d1e717848f6a10a596be2d0 Signed-off-by: lal.harshita --- src/du_app/du_e2ap_msg_hdl.c | 198 +++++++++++++++++++++++++++++++++++++++- src/ric_stub/ric_e2ap_msg_hdl.c | 191 +++++++++++++++++++++++++++++++++++--- 2 files changed, 376 insertions(+), 13 deletions(-) diff --git a/src/du_app/du_e2ap_msg_hdl.c b/src/du_app/du_e2ap_msg_hdl.c index 2041f9bc8..02bc143f6 100644 --- a/src/du_app/du_e2ap_msg_hdl.c +++ b/src/du_app/du_e2ap_msg_hdl.c @@ -117,6 +117,62 @@ void fillE2Cause(CauseE2_t *e2Cause, E2FailureCause failureCause) } } +/******************************************************************* + * + * @brief Printing Type and Cause of failure + * + * @details + * + * Function : printE2ErrorCause + * + * Functionality: Printing Type and Cause of failure + * + * @params[in] E2 Cause + * @return void + * + ******************************************************************/ +void printE2ErrorCause(CauseE2_t *cause) +{ + switch(cause->present) + { + case CauseE2_PR_ricRequest: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Request", cause->choice.ricRequest); + break; + } + case CauseE2_PR_ricService: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Service", cause->choice.ricService); + break; + } + case CauseE2_PR_e2Node: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "E2_Node", cause->choice.e2Node); + break; + } + case CauseE2_PR_transport: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "Transport", cause->choice.transport); + break; + } + case CauseE2_PR_protocol: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "Protocol", cause->choice.protocol); + break; + } + case CauseE2_PR_misc: + { + DU_LOG("Failure_Type [%s] Cause [%ld]", "Miscellaneous", cause->choice.misc); + break; + } + default: + { + DU_LOG("Failure_Type and Cause unknown"); + break; + } + } +} + /******************************************************************* * * @brief Free the ErrorIndication Message @@ -5784,9 +5840,13 @@ uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsMod uint8_t ieIdx = 0, elementCnt=0, actionIdx = 0; uint8_t numActionsMod = 0, numActionsRmv = 0; RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP; - RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP; RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP; +/* Unused in case of E2SM-KPM */ +#if 0 + RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP; +#endif + /* Count number of Actions to be modified or deleted */ for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++) { @@ -6112,11 +6172,14 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP; RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP; +/* Not used in case of E2SM-KPM */ +#if 0 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP; RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP; RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP; RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP; +#endif RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP; RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP; @@ -6305,6 +6368,134 @@ void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg) return; } +/******************************************************************* + * + * @brief Free APER decoding of RIC Subscription Modification Refuse + * + * @details + * + * Function : freeAperDecodingOfRicSubsModRefuse + * + * Functionality: Free APER decoding of RIC Subscription + * Modification Refuse + * + * @param E2AP Message PDU + * @return void + * + ******************************************************************/ +void freeAperDecodingOfRicSubsModRefuse(E2AP_PDU_t *e2apMsg) +{ + uint8_t ieIdx =0; + RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP; + + if(e2apMsg && e2apMsg->choice.unsuccessfulOutcome) + { + ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse; + if(ricSubsModRefuse->protocolIEs.list.array) + { + for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++) + { + if(ricSubsModRefuse->protocolIEs.list.array[ieIdx]) + free(ricSubsModRefuse->protocolIEs.list.array[ieIdx]); + } + free(ricSubsModRefuse->protocolIEs.list.array); + } + } +} + +/******************************************************************* + * + * @brief Process RIC Subscription Modification Refuse Message + * + * @details + * + * Function : procRicSubscriptionModificationRefuse + * + * Functionality: Process RIC Subscription Modification Refuse + * Message received from RIC. + * + * @param E2AP Message PDU + * @return void + * + ******************************************************************/ +void procRicSubscriptionModificationRefuse(E2AP_PDU_t *e2apMsg) +{ + uint8_t ieIdx = 0; + uint16_t ranFuncId = 0; + RicRequestId ricReqId; + RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP; + RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP; + CauseE2_t *cause = NULLP; + + DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Refuse", __func__); + + do{ + if(!e2apMsg) + { + DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__); + break; + } + + if(!e2apMsg->choice.unsuccessfulOutcome) + { + DU_LOG("\nERROR --> E2AP : %s: Unsuccessful Outcome in E2AP message is NULL", __func__); + break; + } + + ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse; + if(!ricSubsModRefuse->protocolIEs.list.array) + { + DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__); + break; + } + + for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++) + { + if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx]) + { + DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx); + break; + } + + ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx]; + switch(ricSubsModRefuseIe->id) + { + case ProtocolIE_IDE2_id_RICrequestID: + { + memset(&ricReqId, 0, sizeof(RicRequestId)); + ricReqId.requestorId = ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID; + ricReqId.instanceId = ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID; + break; + } + + case ProtocolIE_IDE2_id_RANfunctionID: + { + ranFuncId = ricSubsModRefuseIe->value.choice.RANfunctionID; + break; + } + + case ProtocolIE_IDE2_id_CauseE2: + { + DU_LOG("\nDEBUG --> E2AP : %s: RIC subscriptiom modification refused for RIC_Requestor_ID [%d] \ + RIC_Instance_ID [%d] RAN_Function_ID [%d] ", __func__, ricReqId.requestorId, \ + ricReqId.instanceId, ranFuncId); + + cause = &ricSubsModRefuseIe->value.choice.CauseE2; + printE2ErrorCause(cause); + } + + default: + break; + } /* End of switch for Protocol IE Id */ + } /* End of for loop for Protocol IE list */ + + break; + }while(true); + + freeAperDecodingOfRicSubsModRefuse(e2apMsg); + return; +} + /******************************************************************* * * @brief Handles received E2AP message and sends back response @@ -6394,6 +6585,11 @@ void E2APMsgHdlr(Buffer *mBuf) procRicServiceUpdateFailure(e2apMsg); break; } + case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse: + { + procRicSubscriptionModificationRefuse(e2apMsg); + break; + } default: { DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_unsuccessfulOutcome [%d]",\ diff --git a/src/ric_stub/ric_e2ap_msg_hdl.c b/src/ric_stub/ric_e2ap_msg_hdl.c index 7aa242ca4..ee63fbf7e 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.c +++ b/src/ric_stub/ric_e2ap_msg_hdl.c @@ -3119,6 +3119,175 @@ uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricS 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 @@ uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFa /******************************************************************* * - * @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 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t { /* 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; } @@ -3725,8 +3893,8 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t { /* 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; @@ -3790,9 +3958,8 @@ uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t } 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; -- 2.16.6