X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=e2ap%2Flibe2ap_wrapper%2FE2AP_if.c;h=64bb5bcb7320c93c0d3c9718a75fa612bee303c4;hb=HEAD;hp=86869081010653d2f41674b1703b628352b1b535;hpb=cdc35bff0dd4c41d1e764d3f48efa70d9f33a8f7;p=ric-plt%2Fsubmgr.git diff --git a/e2ap/libe2ap_wrapper/E2AP_if.c b/e2ap/libe2ap_wrapper/E2AP_if.c index 8686908..64bb5bc 100644 --- a/e2ap/libe2ap_wrapper/E2AP_if.c +++ b/e2ap/libe2ap_wrapper/E2AP_if.c @@ -27,12 +27,12 @@ #include "asn_constant.h" #include "E2AP_if.h" +static bool debugPrints = false; -#ifdef DEBUG - static const bool debug = true; -#else - static const bool debug = true; //false; -#endif +// Value of checkIEOrder defines if strict order to be followed while +// packing/unpacking of E2AP messages. +// Value 1 defines strict order and value 0 defines lenient order +static uint8_t checkIEOrder = 1; const int64_t cMaxNrOfErrors = 256; const uint64_t cMaxSizeOfOctetString = 1024; @@ -60,6 +60,7 @@ const uint64_t cE2UnsuccessfulOutcome = 3; // Initiating message const uint64_t cRICSubscriptionRequest = 1; const uint64_t cRICSubscriptionDeleteRequest = 2; +const uint64_t cRICSubscriptionDeleteRequired = 3; // Successful outcome const uint64_t cRICSubscriptionResponse = 1; @@ -74,6 +75,16 @@ typedef union { uint8_t octets[4]; } IdOctects_t; +////////////////////////////////////////////////////////////////////// +void allowASN1DebugPrints(bool allowASN1DebugPrints) { + debugPrints = allowASN1DebugPrints; +} + +////////////////////////////////////////////////////////////////////// +void allowOutOfOrderIEMsg(uint8_t e2IEOrderCheckEnabled) { + checkIEOrder = e2IEOrderCheckEnabled; +} + ////////////////////////////////////////////////////////////////////// const char* getE2ErrorString(uint64_t errorCode) { @@ -83,8 +94,7 @@ const char* getE2ErrorString(uint64_t errorCode) { ///////////////////////////////////////////////////////////////////// bool E2encode(E2AP_PDU_t* pE2AP_PDU, size_t* dataBufferSize, byte* dataBuffer, char* pLogBuffer) { - // Debug print - if (debug) + if (debugPrints) asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU); asn_enc_rval_t rval; @@ -100,7 +110,7 @@ bool E2encode(E2AP_PDU_t* pE2AP_PDU, size_t* dataBufferSize, byte* dataBuffer, c return false; } else { - if (debug) + if (debugPrints) sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2AP_PDU.name, *dataBufferSize, rval.encoded); ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); @@ -247,32 +257,39 @@ uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, pE2AP_PDU->choice.initiatingMessage.value.present = SuccessfulOutcome__value_PR_RICsubscriptionResponse; // RICrequestID - RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); - if (pRICsubscriptionResponse_IEs) { - pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICrequestID; - pRICsubscriptionResponse_IEs->criticality = Criticality_reject; - pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID; - pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionResponse->ricRequestID.ricRequestorID; - pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionResponse->ricRequestID.ricInstanceID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs); + RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs_RicRequestID = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); + if (pRICsubscriptionResponse_IEs_RicRequestID) { + pRICsubscriptionResponse_IEs_RicRequestID->id = ProtocolIE_ID_id_RICrequestID; + pRICsubscriptionResponse_IEs_RicRequestID->criticality = Criticality_reject; + pRICsubscriptionResponse_IEs_RicRequestID->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID; + pRICsubscriptionResponse_IEs_RicRequestID->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionResponse->ricRequestID.ricRequestorID; + pRICsubscriptionResponse_IEs_RicRequestID->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionResponse->ricRequestID.ricInstanceID; } else return e2err_RICSubscriptionResponseAllocRICrequestIDFail; // RANfunctionID - pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); - if (pRICsubscriptionResponse_IEs) { - pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID; - pRICsubscriptionResponse_IEs->criticality = Criticality_reject; - pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID; - pRICsubscriptionResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionResponse->ranFunctionID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs); + RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs_RANFunctionID = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); + if (pRICsubscriptionResponse_IEs_RANFunctionID) { + pRICsubscriptionResponse_IEs_RANFunctionID->id = ProtocolIE_ID_id_RANfunctionID; + pRICsubscriptionResponse_IEs_RANFunctionID->criticality = Criticality_reject; + pRICsubscriptionResponse_IEs_RANFunctionID->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID; + pRICsubscriptionResponse_IEs_RANFunctionID->value.choice.RANfunctionID = pRICSubscriptionResponse->ranFunctionID; } else return e2err_RICSubscriptionResponseAllocRANfunctionIDFail; + // Check if Out of order IE messages to be packed, add RANFunctionID IE before RICRequestID + if (checkIEOrder) { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RicRequestID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RANFunctionID); + } else { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RANFunctionID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RicRequestID); + } + // RICaction-Admitted list - pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); + RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t)); if (pRICsubscriptionResponse_IEs) { pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_Admitted; pRICsubscriptionResponse_IEs->criticality = Criticality_reject; @@ -324,7 +341,7 @@ uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID = pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID; - // RICCause + // Cause if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_ricRequest) { pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_ricRequest; pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest = @@ -335,6 +352,11 @@ uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService = pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; } + else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_e2Node) { + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_e2Node; + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.e2Node = + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; + } else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_transport) { pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_transport; pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport = @@ -380,87 +402,77 @@ uint64_t packRICSubscriptionFailure(size_t* pDataBufferSize, byte* pDataBuffer, pE2AP_PDU->choice.unsuccessfulOutcome.value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionFailure; // RICrequestID - RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); - if (pRICsubscriptionFailure_IEs) { - pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICrequestID; - pRICsubscriptionFailure_IEs->criticality = Criticality_reject; - pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID; - pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionFailure->ricRequestID.ricRequestorID; - pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionFailure->ricRequestID.ricInstanceID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs); + RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs_RICrequestID = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); + if (pRICsubscriptionFailure_IEs_RICrequestID) { + pRICsubscriptionFailure_IEs_RICrequestID->id = ProtocolIE_ID_id_RICrequestID; + pRICsubscriptionFailure_IEs_RICrequestID->criticality = Criticality_reject; + pRICsubscriptionFailure_IEs_RICrequestID->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID; + pRICsubscriptionFailure_IEs_RICrequestID->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionFailure->ricRequestID.ricRequestorID; + pRICsubscriptionFailure_IEs_RICrequestID->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionFailure->ricRequestID.ricInstanceID; } else return e2err_RICSubscriptionFailureAllocRICrequestIDFail; // RANfunctionID - pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); - if (pRICsubscriptionFailure_IEs) { - pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID; - pRICsubscriptionFailure_IEs->criticality = Criticality_reject; - pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID; - pRICsubscriptionFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionFailure->ranFunctionID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs); + RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs_RANfunctionID = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); + if (pRICsubscriptionFailure_IEs_RANfunctionID) { + pRICsubscriptionFailure_IEs_RANfunctionID->id = ProtocolIE_ID_id_RANfunctionID; + pRICsubscriptionFailure_IEs_RANfunctionID->criticality = Criticality_reject; + pRICsubscriptionFailure_IEs_RANfunctionID->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID; + pRICsubscriptionFailure_IEs_RANfunctionID->value.choice.RANfunctionID = pRICSubscriptionFailure->ranFunctionID; } else return e2err_RICSubscriptionFailureAllocRANfunctionIDFail; - // RICaction-NotAdmitted list - pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); + // Check if Out of order IE messages to be packed, add RANFunctionID IE before RICRequestID + if (checkIEOrder) { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs_RICrequestID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs_RANfunctionID); + } else { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs_RANfunctionID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs_RICrequestID); + } + + // Cause + RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); if (pRICsubscriptionFailure_IEs) { - pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted; + pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_Cause; pRICsubscriptionFailure_IEs->criticality = Criticality_reject; - pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List; - - uint64_t index = 0; - while (index < pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) { - - RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t)); - if (pRICaction_NotAdmitted_ItemIEs) - { - pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item; - pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject; - pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item; - - // RICActionID - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID; - - // RICCause - if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_ricRequest) { - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_ricRequest; - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; - } - else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_ricService) { - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_ricService; - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; - } - else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_transport) { - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_transport; - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; - } - else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_protocol) { - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_protocol; - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; - } - else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_misc) { - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_misc; - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc = - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal; - } - ASN_SEQUENCE_ADD(&pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs); - } - else - return e2err_RICSubscriptionFailureAllocRICaction_NotAdmitted_ItemIEsFail; - index++; + pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_Cause; + if (pRICSubscriptionFailure->cause.content == Cause_PR_ricRequest) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_ricRequest; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricRequest = + pRICSubscriptionFailure->cause.causeVal; + } + else if (pRICSubscriptionFailure->cause.content == Cause_PR_ricService) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_ricService; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricService = + pRICSubscriptionFailure->cause.causeVal; + } + else if (pRICSubscriptionFailure->cause.content == Cause_PR_e2Node) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_e2Node; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.e2Node = + pRICSubscriptionFailure->cause.causeVal; + } + else if (pRICSubscriptionFailure->cause.content == Cause_PR_transport) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_transport; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.transport = + pRICSubscriptionFailure->cause.causeVal; + } + else if (pRICSubscriptionFailure->cause.content == Cause_PR_protocol) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_protocol; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.protocol = + pRICSubscriptionFailure->cause.causeVal; + } + else if (pRICSubscriptionFailure->cause.content == Cause_PR_misc) { + pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_misc; + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.misc = + pRICSubscriptionFailure->cause.causeVal; } ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs); } else - return e2err_RICSubscriptionFailureAllocRICActionAdmittedListFail; + return e2err_RICSubscriptionFailureAllocCauseFail; // CriticalityDiagnostics, OPTIONAL. Not used in RIC @@ -530,30 +542,37 @@ uint64_t packRICSubscriptionDeleteResponse(size_t* pDataBufferSize, byte* pDataB pE2AP_PDU->choice.successfulOutcome.value.present = SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse; // RICrequestID - RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t)); - if (pRICsubscriptionDeleteResponse_IEs) { - pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RICrequestID; - pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject; - pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID; - pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID; - pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs); + RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs_RICrequestID = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t)); + if (pRICsubscriptionDeleteResponse_IEs_RICrequestID) { + pRICsubscriptionDeleteResponse_IEs_RICrequestID->id = ProtocolIE_ID_id_RICrequestID; + pRICsubscriptionDeleteResponse_IEs_RICrequestID->criticality = Criticality_reject; + pRICsubscriptionDeleteResponse_IEs_RICrequestID->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID; + pRICsubscriptionDeleteResponse_IEs_RICrequestID->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID; + pRICsubscriptionDeleteResponse_IEs_RICrequestID->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID; } else return e2err_RICSubscriptionDeleteResponseAllocRICrequestIDFail; // RANfunctionID - pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t)); - if (pRICsubscriptionDeleteResponse_IEs) { - pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID; - pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject; - pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID; - pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteResponse->ranFunctionID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs); + RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs_RANfunctionID = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t)); + if (pRICsubscriptionDeleteResponse_IEs_RANfunctionID) { + pRICsubscriptionDeleteResponse_IEs_RANfunctionID->id = ProtocolIE_ID_id_RANfunctionID; + pRICsubscriptionDeleteResponse_IEs_RANfunctionID->criticality = Criticality_reject; + pRICsubscriptionDeleteResponse_IEs_RANfunctionID->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID; + pRICsubscriptionDeleteResponse_IEs_RANfunctionID->value.choice.RANfunctionID = pRICSubscriptionDeleteResponse->ranFunctionID; } else return e2err_RICSubscriptionDeleteResponseAllocRANfunctionIDFail; + // // Check if Out of order IE messages to be packed, add RANFunctionID IE before RICRequestID + if (checkIEOrder) { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs_RICrequestID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs_RANfunctionID); + } else { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs_RANfunctionID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs_RICrequestID); + } + if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer)) return e2err_OK; else @@ -574,32 +593,39 @@ uint64_t packRICSubscriptionDeleteFailure(size_t* pDataBufferSize, byte* pDataBu pE2AP_PDU->choice.unsuccessfulOutcome.value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure; // RICrequestID - RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); - if (pRICsubscriptionDeleteFailure_IEs) { - pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICrequestID; - pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject; - pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID; - pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID; - pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs); + RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs_RICrequestID = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); + if (pRICsubscriptionDeleteFailure_IEs_RICrequestID) { + pRICsubscriptionDeleteFailure_IEs_RICrequestID->id = ProtocolIE_ID_id_RICrequestID; + pRICsubscriptionDeleteFailure_IEs_RICrequestID->criticality = Criticality_reject; + pRICsubscriptionDeleteFailure_IEs_RICrequestID->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID; + pRICsubscriptionDeleteFailure_IEs_RICrequestID->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID; + pRICsubscriptionDeleteFailure_IEs_RICrequestID->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID; } else return e2err_RICSubscriptionDeleteFailureAllocRICrequestIDFail; // RANfunctionID - pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); - if (pRICsubscriptionDeleteFailure_IEs) { - pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID; - pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject; - pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID; - pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteFailure->ranFunctionID; - ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs); + RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs_RANfunctionID = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); + if (pRICsubscriptionDeleteFailure_IEs_RANfunctionID) { + pRICsubscriptionDeleteFailure_IEs_RANfunctionID->id = ProtocolIE_ID_id_RANfunctionID; + pRICsubscriptionDeleteFailure_IEs_RANfunctionID->criticality = Criticality_reject; + pRICsubscriptionDeleteFailure_IEs_RANfunctionID->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID; + pRICsubscriptionDeleteFailure_IEs_RANfunctionID->value.choice.RANfunctionID = pRICSubscriptionDeleteFailure->ranFunctionID; } else return e2err_RICSubscriptionDeleteFailureAllocRANfunctionIDFail; - // RICcause - pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); + // Check if Out of order IE messages to be packed, add RANFunctionID IE before RICRequestID + if (checkIEOrder) { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs_RICrequestID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs_RANfunctionID); + } else { + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs_RANfunctionID); + ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs_RICrequestID); + } + + // Cause + RICsubscriptionFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); if (pRICsubscriptionDeleteFailure_IEs) { pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_Cause; pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject; @@ -614,6 +640,11 @@ uint64_t packRICSubscriptionDeleteFailure(size_t* pDataBufferSize, byte* pDataBu pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricService = pRICSubscriptionDeleteFailure->cause.causeVal; } + else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_e2Node) { + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_e2Node; + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.e2Node = + pRICSubscriptionDeleteFailure->cause.causeVal; + } else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_transport) { pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_transport; pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.transport = @@ -653,8 +684,7 @@ e2ap_pdu_ptr_t* unpackE2AP_pdu(const size_t dataBufferSize, const byte* dataBuff rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **)&pE2AP_PDU, dataBuffer, dataBufferSize); switch (rval.code) { case RC_OK: - // Debug print - if (debug) { + if (debugPrints) { sprintf(pLogBuffer,"Successfully decoded E2AP-PDU"); asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU); } @@ -681,6 +711,18 @@ e2ap_pdu_ptr_t* unpackE2AP_pdu(const size_t dataBufferSize, const byte* dataBuff sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present); return 0; } + }else if (pE2AP_PDU->choice.initiatingMessage.procedureCode == + ProcedureCode_id_RICsubscriptionDeleteRequired) { + if (pE2AP_PDU->choice.initiatingMessage.value.present == + InitiatingMessage__value_PR_RICsubscriptionDeleteRequired) { + pMessageInfo->messageType = cE2InitiatingMessage; + pMessageInfo->messageId = cRICSubscriptionDeleteRequired; + return (e2ap_pdu_ptr_t *) pE2AP_PDU; + } else { + sprintf(pLogBuffer, "Error. Not supported initiatingMessage MessageId = %u", + pE2AP_PDU->choice.initiatingMessage.value.present); + return 0; + } } else { sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.initiatingMessage.procedureCode); @@ -861,99 +903,122 @@ uint64_t getRICSubscriptionResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSu RICsubscriptionResponse_t *asnRicSubscriptionResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse; RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs; - // RICrequestID - if (asnRicSubscriptionResponse->protocolIEs.list.count > 0 && - asnRicSubscriptionResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) { - pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[0]; - pRICSubscriptionResponse->ricRequestID.ricRequestorID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID; - pRICSubscriptionResponse->ricRequestID.ricInstanceID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricInstanceID; + bool foundRICrequestID = false; + bool foundRANfunctionID = false; + bool foundRICactions_Admitted = false; + bool foundRICaction_NotAdmitted = false; + + for (int i = 0; i < asnRicSubscriptionResponse->protocolIEs.list.count; i++) { + if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) { + if (checkIEOrder && i != 0) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionResponseRICrequestIDWrongOrder; + } + pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i]; + pRICSubscriptionResponse->ricRequestID.ricRequestorID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID; + pRICSubscriptionResponse->ricRequestID.ricInstanceID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricInstanceID; + foundRICrequestID = true; + } + else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) { + if (checkIEOrder && i != 1) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionResponseRANfunctionIDWrongOrder; + } + pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i]; + pRICSubscriptionResponse->ranFunctionID = pRICsubscriptionResponse_IEs->value.choice.RANfunctionID; + foundRANfunctionID = true; + } + else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_Admitted) { + if (checkIEOrder && i != 2) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionResponseRICaction_Admitted_ListWrongOrder; + } + pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i]; + pRICSubscriptionResponse->ricActionAdmittedList.contentLength = 0; + uint64_t index = 0; + while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.count)) { + RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs = + (RICaction_Admitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.array[index]; + + // RICActionID + pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index] = + pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID; + index++; + } + pRICSubscriptionResponse->ricActionAdmittedList.contentLength = index; + foundRICactions_Admitted = true; + } + else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) { + if (checkIEOrder && i != 3) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionResponseRICaction_NotAdmitted_ListWrongOrder; + } + pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i]; + if (pRICsubscriptionResponse_IEs->value.present == RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List) { + pRICSubscriptionResponse->ricActionNotAdmittedListPresent = true; + pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0; + uint64_t index = 0; + while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) { + RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = + (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index]; + + // RICActionID + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID; + + // Cause + if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricRequest) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricRequest; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest; + } + else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricService) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricService; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService; + } + else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_e2Node) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_e2Node; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.e2Node; + } + else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_transport) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_transport; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport; + } + else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_protocol) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_protocol; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol; + } + else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_misc) { + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_misc; + pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = + pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc; + } + index++; + } + pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = index; + foundRICaction_NotAdmitted = true; + } + } } - else { + + if (!foundRICrequestID) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionResponseRICrequestIDMissing; } - - // RANfunctionID - if (asnRicSubscriptionResponse->protocolIEs.list.count > 1 && - asnRicSubscriptionResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) { - pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[1]; - pRICSubscriptionResponse->ranFunctionID = pRICsubscriptionResponse_IEs->value.choice.RANfunctionID; - } - else { + if (!foundRANfunctionID) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionResponseRANfunctionIDMissing; } - - // RICaction-Admitted-List - if (asnRicSubscriptionResponse->protocolIEs.list.count > 2 && - asnRicSubscriptionResponse->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_Admitted) { - pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[2]; - pRICSubscriptionResponse->ricActionAdmittedList.contentLength = 0; - uint64_t index = 0; - while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.count)) { - RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs = - (RICaction_Admitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.array[index]; - - // RICActionID - pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index] = - pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID; - index++; - } - pRICSubscriptionResponse->ricActionAdmittedList.contentLength = index; - } - else { + if (!foundRICactions_Admitted) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionResponseRICaction_Admitted_ListMissing; } - // RICaction-NotAdmitted-List, OPTIONAL - if (asnRicSubscriptionResponse->protocolIEs.list.count > 3 && - asnRicSubscriptionResponse->protocolIEs.list.array[3]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) { - pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[3]; - if (pRICsubscriptionResponse_IEs->value.present == RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List) { - pRICSubscriptionResponse->ricActionNotAdmittedListPresent = true; - pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0; - uint64_t index = 0; - while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) { - RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = - (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index]; - - // RICActionID - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID; - - // RICcause - if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricRequest) { - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricRequest; - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest; - } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricService) { - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricService; - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService; - } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_transport) { - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_transport; - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport; - } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_protocol) { - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_protocol; - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol; - } - else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_misc) { - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_misc; - pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc; - } - index++; - } - pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = index; - } - } - else { + if (!foundRICaction_NotAdmitted) { pRICSubscriptionResponse->ricActionNotAdmittedListPresent = false; pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0; } @@ -969,79 +1034,83 @@ uint64_t getRICSubscriptionFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSub RICsubscriptionFailure_t *asnRicSubscriptionFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure; RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs; - // RICrequestID - if (asnRicSubscriptionFailure->protocolIEs.list.count > 0 && - asnRicSubscriptionFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) { - pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[0]; - pRICSubscriptionFailure->ricRequestID.ricRequestorID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID; - pRICSubscriptionFailure->ricRequestID.ricInstanceID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricInstanceID; - } - else { - ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); - return e2err_RICsubscriptionFailureRICrequestIDMissing; - } + bool foundRICrequestID = false; + bool foundRANfunctionID = false; + bool foundCause = false; - // RANfunctionID - if (asnRicSubscriptionFailure->protocolIEs.list.count > 1 && - asnRicSubscriptionFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) { - pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[1]; - pRICSubscriptionFailure->ranFunctionID = pRICsubscriptionFailure_IEs->value.choice.RANfunctionID; - } - else { - ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); - return e2err_RICsubscriptionFailureRANfunctionIDMissing; - } - - // RICaction-NotAdmitted-List - if (asnRicSubscriptionFailure->protocolIEs.list.count > 2 && - asnRicSubscriptionFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) { - pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[2]; - uint64_t index = 0; - while ((index < maxofRICactionID) && (index < pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) { - RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = - (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index]; - - // RICActionID - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID; - - // RICcause - if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricRequest) { - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricRequest; - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest; + for (int i = 0; i < asnRicSubscriptionFailure->protocolIEs.list.count; i++) { + if (asnRicSubscriptionFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) { + if (checkIEOrder && i != 0) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionFailureRICrequestIDWrongOrder; + } + pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[i]; + pRICSubscriptionFailure->ricRequestID.ricRequestorID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID; + pRICSubscriptionFailure->ricRequestID.ricInstanceID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricInstanceID; + foundRICrequestID = true; + } + else if (asnRicSubscriptionFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) { + if (checkIEOrder && i != 1) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionFailureRANfunctionIDWrongOrder; } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricService) { - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricService; - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService; + pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[i]; + pRICSubscriptionFailure->ranFunctionID = pRICsubscriptionFailure_IEs->value.choice.RANfunctionID; + foundRANfunctionID = true; + } + else if (asnRicSubscriptionFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_Cause) { + if (checkIEOrder && i != 2) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionFailureCauseWrongOrder; } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_transport) { - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_transport; - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport; + pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[i]; + if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_ricRequest) { + pRICSubscriptionFailure->cause.content = Cause_PR_ricRequest; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricRequest; } - else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_protocol) { - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_protocol; - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol; + else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_ricService) { + pRICSubscriptionFailure->cause.content = Cause_PR_ricService; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricService; } - else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_misc) { - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_misc; - pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal = - pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc; + else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_e2Node) { + pRICSubscriptionFailure->cause.content = Cause_PR_e2Node; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.e2Node; } - index++; + else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_transport) { + pRICSubscriptionFailure->cause.content = Cause_PR_transport; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.transport; + } + else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_protocol) { + pRICSubscriptionFailure->cause.content = Cause_PR_protocol; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.protocol; + } + else if(pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_misc) { + pRICSubscriptionFailure->cause.content = Cause_PR_misc; + pRICSubscriptionFailure->cause.causeVal = + pRICsubscriptionFailure_IEs->value.choice.Cause.choice.misc; + } + foundCause = true; } - pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength = index; - - // CriticalityDiagnostics. OPTIONAL + } + if (!foundRICrequestID) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionFailureRICrequestIDMissing; } - else { + if (!foundRANfunctionID) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); - return e2err_RICsubscriptionFailureRICaction_NotAdmitted_ListMissing; + return e2err_RICsubscriptionFailureRANfunctionIDMissing; } + if (!foundCause) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionFailureCauseMissing; + } + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_OK; } @@ -1088,28 +1157,41 @@ uint64_t getRICSubscriptionDeleteResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICsubscriptionDeleteResponse_t *asnRicSubscriptionDeleteResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse; RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs; - // RICrequestID - if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 0 && - asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) { - pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0]; - pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID; - pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricInstanceID; + bool ricRequestIDFound = false; + bool ranFunctionIDFound = false; + + for (int i = 0; i < asnRicSubscriptionDeleteResponse->protocolIEs.list.count; i++) { + pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[i]; + + if (pRICsubscriptionDeleteResponse_IEs->id == ProtocolIE_ID_id_RICrequestID) { + if (checkIEOrder && i != 0) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteResponseRICrequestIDWrongOrder; + } + pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID; + pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricInstanceID; + ricRequestIDFound = true; + } + else if (pRICsubscriptionDeleteResponse_IEs->id == ProtocolIE_ID_id_RANfunctionID) { + if (checkIEOrder && i != 1) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteResponseRANfunctionIDWrongOrder; + } + pRICSubscriptionDeleteResponse->ranFunctionID = pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID; + ranFunctionIDFound = true; + } } - else { + + if (!ricRequestIDFound) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionDeleteResponseRICrequestIDMissing; } - // RANfunctionID - if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 1 && - asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) { - pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1]; - pRICSubscriptionDeleteResponse->ranFunctionID = pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID; - } - else { + if (!ranFunctionIDFound) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionDeleteResponseRANfunctionIDMissing; } + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_OK; } @@ -1122,66 +1204,238 @@ uint64_t getRICSubscriptionDeleteFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICsubscriptionDeleteFailure_t *asnRicSubscriptionDeleteFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure; RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs; - // RICrequestID - if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 0 && - asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) { - pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0]; - pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID; - pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricInstanceID; - } - else { - ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); - return e2err_RICsubscriptionDeleteFailureRICrequestIDMissing; + bool foundRICrequestID = false; + bool foundRANfunctionID = false; + bool foundCause = false; + + for (int i = 0; i < asnRicSubscriptionDeleteFailure->protocolIEs.list.count; i++) { + if (asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) { + if (checkIEOrder && i != 0) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteFailureRICrequestIDWrongOrder; + } + pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]; + pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID; + pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricInstanceID; + foundRICrequestID = true; + } else if (asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) { + if (checkIEOrder && i != 1) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteFailureRANfunctionIDWrongOrder; + } + pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]; + pRICSubscriptionDeleteFailure->ranFunctionID = pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID; + foundRANfunctionID = true; + } else if (asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_Cause) { + if (checkIEOrder && i != 2) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteFailureRICcauseWrongOrder; + } + pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[i]; + if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricRequest) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricRequest; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricRequest; + } + else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricService) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricService; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricService; + } + else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_e2Node) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_e2Node; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.e2Node; + } + else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_transport) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_transport; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.transport; + } + else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_protocol) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_protocol; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.protocol; + } + else if(pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_misc) { + pRICSubscriptionDeleteFailure->cause.content = Cause_PR_misc; + pRICSubscriptionDeleteFailure->cause.causeVal = + pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.misc; + } + foundCause = true; + } } - // RANfunctionID - if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 1 && - asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) { - pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1]; - pRICSubscriptionDeleteFailure->ranFunctionID = pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID; + if (!foundRICrequestID) { + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_RICsubscriptionDeleteFailureRICrequestIDMissing; } - else { + if (!foundRANfunctionID) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionDeleteFailureRANfunctionIDMissing; } - - // RICcause - if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 2 && - asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_Cause) { - pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2]; - if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricRequest) { - pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricRequest; - pRICSubscriptionDeleteFailure->cause.causeVal = - pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricRequest; - } - else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricService) { - pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricService; - pRICSubscriptionDeleteFailure->cause.causeVal = - pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricService; - } - else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_transport) { - pRICSubscriptionDeleteFailure->cause.content = Cause_PR_transport; - pRICSubscriptionDeleteFailure->cause.causeVal = - pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.transport; - } - else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_protocol) { - pRICSubscriptionDeleteFailure->cause.content = Cause_PR_protocol; - pRICSubscriptionDeleteFailure->cause.causeVal = - pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.protocol; - } - else if(pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_misc) { - pRICSubscriptionDeleteFailure->cause.content = Cause_PR_misc; - pRICSubscriptionDeleteFailure->cause.causeVal = - pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.misc; - } - } - else { + if (!foundCause) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionDeleteFailureRICcauseMissing; } + // CriticalityDiagnostics, OPTIONAL ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_OK; } +//************************************************************************************************************************** +uint64_t packRICSubscriptionDeleteRequired(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubsDeleteRequired_t* pRICSubscriptionDeleteRequired) { + + E2AP_PDU_t *pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t)); + if (pE2AP_PDU) { + pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage; + pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_RICsubscriptionDeleteRequired; + pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore; + pE2AP_PDU->choice.initiatingMessage.value.present = InitiatingMessage__value_PR_RICsubscriptionDeleteRequired; + + { + RICsubscriptionDeleteRequired_IEs_t *ricSubsDeleteRequiredIEs = calloc(1, + sizeof(RICsubscriptionDeleteRequired_IEs_t)); + ricSubsDeleteRequiredIEs->id = ProtocolIE_ID_id_RICsubscriptionToBeRemoved; + ricSubsDeleteRequiredIEs->criticality = Criticality_ignore; + ricSubsDeleteRequiredIEs->value.present = RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause; + + for (int idx = 0; idx < pRICSubscriptionDeleteRequired->noOfRanSubscriptions; idx++) { + RICsubscription_withCause_ItemIEs_t *ricSubsListWithCauseItem = calloc(1, + sizeof(RICsubscription_withCause_ItemIEs_t)); + ricSubsListWithCauseItem->id = ProtocolIE_ID_id_RICsubscription_withCause_Item; + ricSubsListWithCauseItem->criticality = Criticality_ignore; + ricSubsListWithCauseItem->value.present = RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item; + + // RIC RequestID + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ricRequestID.ricRequestorID = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricRequestorID; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ricRequestID.ricInstanceID = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricInstanceID; + + // RANFunctionID + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ranFunctionID = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ranFunctionID; + + // RICCause + if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_ricRequest) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_ricRequest; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.ricRequest = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_ricService) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_ricService; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.ricService = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_e2Node) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_e2Node; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.e2Node = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_protocol) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_protocol; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.protocol = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_transport) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_transport; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.transport = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content == + Cause_PR_misc) { + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_misc; + ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.misc = + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal; + } + asn_sequence_add(&ricSubsDeleteRequiredIEs->value.choice.RICsubscription_List_withCause.list, + ricSubsListWithCauseItem); + } + asn_sequence_add( + &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequired.protocolIEs.list, + ricSubsDeleteRequiredIEs); + + if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer)) + return e2err_OK; + else + return e2err_RICSubscriptionDeleteRequiredEncodeFail; + } + } + else + return e2err_RICSubscriptionDeleteRequiredAllocE2AP_PDUFail; +} + +//************************************************************************************************************************** +uint64_t getRICSubscriptionDeleteRequiredData(e2ap_pdu_ptr_t *pE2AP_PDU_pointer, + RICSubsDeleteRequired_t *pRICSubscriptionDeleteRequired) { + + E2AP_PDU_t *pE2AP_PDU = (E2AP_PDU_t *) pE2AP_PDU_pointer; + + RICsubscriptionDeleteRequired_t *asnRicSubscriptionDeleteRequired = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequired; + + if (asnRicSubscriptionDeleteRequired->protocolIEs.list.count > 0 && + asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->id == + ProtocolIE_ID_id_RICsubscriptionToBeRemoved) { + if (asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->value.present == + RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause) { + RICsubscription_List_withCause_t riCsubscriptionListWithCause = asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->value.choice.RICsubscription_List_withCause; + pRICSubscriptionDeleteRequired->noOfRanSubscriptions = riCsubscriptionListWithCause.list.count; + for (int idx = 0; idx < riCsubscriptionListWithCause.list.count; idx++) { + RICsubscription_withCause_ItemIEs_t *riCsubscriptionWithCauseItemIEs = (RICsubscription_withCause_ItemIEs_t*)riCsubscriptionListWithCause.list.array[idx]; + if (riCsubscriptionWithCauseItemIEs->id == ProtocolIE_ID_id_RICsubscription_withCause_Item && + riCsubscriptionWithCauseItemIEs->value.present == + RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item) { + // RIC RequestID + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricRequestorID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ricRequestID.ricRequestorID; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricInstanceID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ricRequestID.ricInstanceID; + + // RANFunctionID + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ranFunctionID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ranFunctionID; + + // RICCause + if (riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present == + Cause_PR_ricRequest) { + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_ricRequest; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal = + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.ricRequest; + } + //TODO : RIC Cause + else if (riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present == + Cause_PR_ricService) { + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_ricService; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal = + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.ricService; + } else if ( + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present == + Cause_PR_transport) { + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_transport; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal = + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.transport; + } else if ( + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present == + Cause_PR_protocol) { + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_protocol; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal = + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.protocol; + } else if ( + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present == + Cause_PR_misc) { + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_misc; + pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal = + riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.misc; + } + } + } + + } + + } + + + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); + return e2err_OK; + } +