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=2515b811ca87af489d1ab0e6542d45e36004542f;hpb=4378baf6754d656738f9f55233e7598ae05df2d6;p=ric-plt%2Fsubmgr.git diff --git a/e2ap/libe2ap_wrapper/E2AP_if.c b/e2ap/libe2ap_wrapper/E2AP_if.c index 2515b81..64bb5bc 100644 --- a/e2ap/libe2ap_wrapper/E2AP_if.c +++ b/e2ap/libe2ap_wrapper/E2AP_if.c @@ -29,6 +29,11 @@ static bool debugPrints = false; +// 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; @@ -75,6 +80,11 @@ void allowASN1DebugPrints(bool allowASN1DebugPrints) { debugPrints = allowASN1DebugPrints; } +////////////////////////////////////////////////////////////////////// +void allowOutOfOrderIEMsg(uint8_t e2IEOrderCheckEnabled) { + checkIEOrder = e2IEOrderCheckEnabled; +} + ////////////////////////////////////////////////////////////////////// const char* getE2ErrorString(uint64_t errorCode) { @@ -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; @@ -385,32 +402,39 @@ 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; + // 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 - pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); + RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t)); if (pRICsubscriptionFailure_IEs) { pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_Cause; pRICsubscriptionFailure_IEs->criticality = Criticality_reject; @@ -518,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 @@ -562,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; + // 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 - pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t)); + 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; @@ -865,104 +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; - - // 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; - } - } - else { + if (!foundRICaction_NotAdmitted) { pRICSubscriptionResponse->ricActionNotAdmittedListPresent = false; pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0; } @@ -978,65 +1034,79 @@ 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; + + 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; + } + 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; + } + 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 (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 (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; + } + 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; + } } - // 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; + 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_RICsubscriptionFailureRANfunctionIDMissing; } - - // Cause - if (asnRicSubscriptionFailure->protocolIEs.list.count > 2 && - asnRicSubscriptionFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_Cause) { - pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[2]; - 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 (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 (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; - } - 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; - } - } - else { + if (!foundCause) { ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU); return e2err_RICsubscriptionFailureCauseMissing; } @@ -1087,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; } @@ -1121,68 +1204,81 @@ 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; } - - // Cause - 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_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; - } - } - 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);